归并排序模板
来源:互联网 发布:c语音编程招聘 编辑:程序博客网 时间:2024/06/06 02:22
归并:将两个或两个以上的有序表组合成一个新的有序表。
一般情况不用这种方式排序,只有在将多个有序序列整合成一个有序序列是才会用到归并排序,才能想归并效率体现的最高。
算法描叙:
1、设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1。
2、两两合并,得到 n/2 个长度为2或1的有序子序列。
3、再两两合并,……如此重复,直至得到一个长度为n的有序序列为止。
个人见解:也就是先将一个无序的序列对半拆分,将拆分后的序列继续拆分,直到拆分成一个元素为一个序列为止,然后在将两个这样的子序列有序的合并成一个序列,以此往回合并,从而达到排序的效果。(思想很容易理解,就是实现起来有点麻烦)
例:
public class SortMethods {/*输出数组中的元素*/private static void print(int[] a) {for(int num: a){System.out.print(num+"\t");}System.out.println();}private static void swap(int[] a, int i, int j) {int temp;temp =a[i];a[i] = a[j];a[j] = temp;}public static void main(String[] args) {int a[] = {0,21,25,49,25,16,15,8,-2,0,-9,67,34,5,12,40};shellSort(a);print(a);}private static void mergeSort(int[] a, int left, int right) {if(left<right){//至少有2个元素int mid = (left+right)/2; //二分,取中点//把序列拆分成两个子序列:[left,mid] 和 [mid+1,right]//同时还要对分解后的子序列分别进行递归“归并排序”mergeSort(a,left,mid);mergeSort(a,mid+1,right);//把前面两个已经排好序的子序列进行归并int b[] = new int[a.length];merge(a,b,left,mid,right);copyArray(a,b,left,right);}}private static void copyArray(int[] a, int[] b, int left, int right) {//这里也可以直接用system中的copyArray来代替for(int i=left;i<=right;i++){a[i] = b[i];}}//把两个已经排好序的子序列(a[left,mid]和a[mid+1,right]) 合并成一个 ( b[left,right] )private static void merge(int[] a, int[] b, int left, int mid, int right) {int p = left;int r=mid+1;int k=left;while( p<=mid && r<=right ){if(a[p]<=a[r]){b[k++] = a[p++];}else{b[k++] = a[r++];}}//此时,肯定有一个子序列中的元素全部移到b[]数组,因此,只要把还未移完的子序列当中的所有剩余元素直接对拷到数组b[]当中即可if(p>mid){//左子序列已经完成。因此剩下的是右序列,对拷右序列当中的剩余元素即可for(int i=r;i<=right;i++){b[k++]=a[i];}}else{//对拷左子序列中的剩余元素for(int i=p;i<=mid;i++){b[k++]=a[i];}}}}
0 0
- 归并排序模板
- C++归并排序模板
- 归并排序的模板
- 归并排序算法模板
- 归并排序模板
- C++模板归并排序
- 归并排序【模板】
- 归并排序模板
- 【模板】归并排序
- 归并排序模板
- 个人模板 归并排序
- [模板]归并排序
- 归并排序模板
- 归并排序模板
- 【模板】归并排序
- 快速排序+归并排序模板
- c++模板实现归并排序
- 归并排序模板w(kl)
- hdu 5329 Question for the Leader
- [Github开源库PinterestLikeAdapterView]--Android瀑布流的实现
- 【翻译自mos文章】rman 标准版和企业版的兼容性
- 寻找素数
- 使用GDB调试程序
- 归并排序模板
- 初学JAVA简谈字符串String存储的以及字符串值的比较(==运算符以及equals())
- Web应用的组件化开发
- hdoj-5112-A Curious Matt
- BestCoder 1st Anniversary 1003(HDU5312)
- 多重背包的取模优化
- secureCRT下乱码,同时操作多会话,上传/下载文件,主机间传输文件,创建多级目录
- 树中两个结点的最低公共祖先
- 解析xml