归并排序
来源:互联网 发布:淘宝双11怎么修改价格 编辑:程序博客网 时间:2024/05/20 18:19
merge sort
归并排序的总体思想:
● 先把序列分成两个部分,对每个部分先排序。
● 对已经分别有序的两个序列,进行合并。
合并:
- 对于要合并的数组 a[]; 先把数组a[] 中的内容
复制
到辅助数组 aux[]
中。- 两个指针i、j 分别指向aux[]中两个有序序列的首元素。
- 从i、j所指的元素中选择小的元素存回数组a[]中;同时更新i、j指针。
- 如果i、j中有指针已经指向了改有序序列的末尾,那么后面就直接复制另一个未结束的序列到a[]中。
排序:
以上归并中,有个前提条件:两个已经有序的子序列
;那么这两个有序的子序列是如何得到的呢?
这其实就用到了递归的思想。
代码:
package mergesort;public class MergeSort { public static void main(String[] args) { int a [] = {45,23,11,89,77,98,4,28,65,43}; sort(a); for(int ele : a) { System.out.println(ele); } } // 合并 private static void merge(int a[], int aux[], int lo, int mid, int hi) { for(int k=lo; k<=hi; k++) { aux[k] = a[k]; } int i = lo; int j = mid+1; for(int k = lo; k<=hi; k++) { if(i>mid) {a[k] = aux[j++];} else if(j>hi) {a[k] = aux[i++];} else if(aux[j] < aux[i]) {a[k] = aux[j++];} else a[k] = aux[i++]; } } private static void sort(int a[], int aux[], int lo, int hi) { if(hi<=lo) return; // 如果只有一个元素需要排序,则停止递归。(递归终止条件) int mid = lo + (hi-lo)/2; // 把数组分成两个部分 sort(a, aux, lo, mid); // 对第一个部分进行排序 sort(a, aux, mid+1, hi); // 对第二个部分进行排序 merge(a, aux, lo, mid, hi); // 对已经排序的两个部分合并 } private static void sort(int a[]) { int aux[] = new int[a.length]; sort(a, aux, 0, a.length-1); }}
图解:
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 《图解HTTP》读书笔记(1)之第一章了解Web及网络基础(关键词:计算机网络/HTTP/Web/网络基础)
- setTimeout与console.log之间执行先后顺序
- Linux中线程栈测试
- 【Java】实现浮点数组的并集以及整型数组的交集和两个字符串数组的逆序排序
- servlet实现秒数跳转操作的源码
- 归并排序
- Centos6.4下搭建redis缓存
- flex 读条
- Mybatis之sql小结
- Linux top命令的用法详细详解
- 测试
- 【Java】结束线程
- 深拷贝与浅拷贝问题
- python对象编程总结(一)