public class MergeSort {
/*
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,
即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
*/
// 归并所需的辅助数组
private static int[] aux;
/**
* 自顶向下的归并排序
* @param a 待排序的数组
* @param low 低位索引
* @param high 高位索引
*/
public static void mergeSort(int[] a, int low, int high) {
// 一次性分配空间
aux = new int[a.length];
// 将数组a[low..high]排序
if (low >= high)
return;
int mid = low + (high - low)/2;
mergeSort(a, low, mid); // 将左半边排序
mergeSort(a, mid+1, high); // 将右半边排序
merge(a, low, mid, high); // 归并结果
}
// 原地归并
public static void merge(int[] a, int low, int mid, int high) {
// 将a[low..mid] 和 a[mid+1..high] 归并
int i = low;
int j = mid+1;
// 将a[low..high]复制到aux[low..high]
for (int k = low; k <= high; k++) {
aux[k] = a[k];
}
// 归并回到a[low..high]
for (int k = low; k <= high; k++) {
if (i > mid)
a[k] = aux[j++];
else if (j > high)
a[k] = aux[i++];
else if (aux[i] > aux[j])
a[k] = aux[j++];
else
a[k] = aux[i++];
}
}
public static void main(String[] args) {
int[] a = new int[] {2, 4, 7, 5, 11, 3, 1, 9, 7, 8, 10, 6, 2, -1, 0, -2};
mergeSort(a, 0, a.length-1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
归并排序
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 选择排序 对于任何输入,时间为O(n*n); 冒泡排序 最优(对于升序的数组,因为加入了一个跳出判断):O(n),...
- 一般来说,这三者的时间复杂度O(NlogN),空间复杂度O(n)优化后,空间复杂度均可为O(1),如下文中的快排和...
- -希尔排序 克服插入排序每次只能交换一对元素的缺点5-间隔的排序,3-间隔的排序,1-间隔排序(最后必须是1-间隔...
- 域名被盗,站长们会烦恼,黑客盗走域名,创建无数二级域名指向到博彩、色性、私服等非法内容的网站上,网站权重降低不说,...