面试算法:归并排序
2023-12-29 13:56:36
题目
归并排序也是一种基于分治法的排序算法。为了排序长度为n的数组,需要先排序两个长度为n/2的子数组,然后合并这两个排序的子数组,于是整个数组也就排序完毕。
分析
归并排序可以用迭代代码实现。例如,输入一个长度为8的数组[4,1,5,6,2,7,8,3],
- 可以先合并相邻的长度为1的子数组得到4个排序的长度为2的子数组。
- 然后合并相邻的长度为2的子数组得到2个排序的长度为4的子数组
- 最后合并相邻的长度为4的子数组,此时整个数组排序完毕
解
public class Test {
public static void main(String[] args) {
int[] nums = {4, 1, 5, 6, 2, 7, 8, 3};
int[] result = sortArray(nums);
for (int item : result) {
System.out.println(item);
}
}
public static int[] sortArray(int[] nums) {
int length = nums.length;
int[] src = nums;
int[] dst = new int[length];
for (int seg = 1; seg < length; seg += seg) {// 合并分段的长度
for (int start = 0; start < length; start += seg * 2) {
int mid = Math.min(start + seg, length);
// i,j两个游标在遍历的时候,j可能先到达end,因为end可能取的是length的值
int end = Math.min(start + seg * 2, length);
int i = start, j = mid, k = start;
while (i < mid || j < end) {
if (j == end || (i < mid && src[i] < src[j])) {
dst[k++] = src[i++];
}
else {
dst[k++] = src[j++];
}
}
}
int[] temp = src;
src = dst;
dst = temp;
}
return src;
}
}
文章来源:https://blog.csdn.net/GoGleTech/article/details/135286931
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!