您的位置:首页 > 编程语言 > Java开发

JAVA的归并排序

2015-10-31 16:22 253 查看
同上篇一致,归并算法也是在笔试与面试中容易考查的一部分,为了面试我可是煞费苦心,看了很多博客,试了很多代码,终于找到一个容易理解与记忆的

这是归并排序的原文地址:http://blog.csdn.net/middlekingt/article/details/8446552

这是另外一位大神的代码,面试啊面试。。

以下为源代码,只是贴出来让自己看看:

package demo;

import java.util.Arrays;

public class Mergesort {
/**
* 归并排序
* 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
* 时间复杂度为O(nlogn)
* 稳定排序方式
* @param nums 待排序数组
* @return 输出有序数组
*/
public static int[] sort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 左边
sort(nums, low, mid);
// 右边
sort(nums, mid + 1, high);
// 左右归并
merge(nums, low, mid, high);
}
return nums;
}

public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int left = low;// 左指针
int right = mid + 1;// 右指针
int k = 0;

// 把较小的数先移到新数组中
while (left <= mid && right <= high) {
if (nums[left] < nums[right]) {
temp[k++] = nums[left++];
} else {
temp[k++] = nums[right++];
}
}

// 把左边剩余的数移入数组
while (left <= mid) {
temp[k++] = nums[left++];
}

// 把右边边剩余的数移入数组
while (right <= high) {
temp[k++] = nums[right++];
}

// 把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
nums[k2 + low] = temp[k2];
}
}

// 归并排序的实现
public static void main(String[] args) {

int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };

Mergesort.sort(nums, 0, nums.length-1);
System.out.println(Arrays.toString(nums));
}
}
归并排序的算法我们通常用递归实现,先把待排序区间[low,high]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并(merge)成有序的区间[low,high]。
该代码的归并过程为:比较nums[left]和nums[right]的大小,若nums[left]≤nums[right],则将前半表中的元素nums[left]复制到temp[k]中,并令left和k分别加上1;否则将第二个有序表中的元素nums[right]复制到temp[k]中,并令right和k分别加上1,如此循环下去,直到前半表取完,然后再将后半表中剩余的元素复制到temp中从下标k到下标t的单元。再用零时表(temp)覆盖现有表(nums)。

其实原作者还有很多不错的博客,有时间再去围观围观。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: