归并排序

别说谁变了你拦得住时间么 提交于 2019-12-01 20:11:19

归并排序

思路

1.归并排序采用了分而治之的策略
2.首先向将整个序列两两划分,在递归地分别对这个序列的左边和右边两两划分,这样直到最小序列为单个元素
3.之后再序列与序列之间两两归并成有序的序列,直到整个序列有序

示意图

拆分序列

合并相邻有序的子序列

转载自https://www.cnblogs.com/chengxiao/p/6194356.html

代码实现

package sort;

import java.util.Arrays;

public class MergeSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a= {10,9,8,7,6,5,4,3,2,1};
        int[] result=new int[a.length];
        System.out.println(Arrays.toString(a));
        mergeSort(a, result, 0, a.length-1);
        System.out.println(Arrays.toString(a));
        
        

    }
    
    public static void mergeSort(int[] a,int[] result,int start,int end)
    {
        if(start>=end)
        {
            return;
        }
        int len=end-start;//长度
        int mid=(len>>1)+start;//中点
        int start1=start;//前半段的起始
        int end1=mid;//前半段的终点
        int start2=mid+1;//前半段的开始
        int end2=end;//后半段的结尾
        mergeSort(a, result, start1, end1);
        mergeSort(a, result, start2, end2);
        int k=start;
        while(start1<=end1&&start2<=end2)//两个有序序列进行归并
        {
            result[k++]=a[start1]<a[start2]?a[start1++]:a[start2++];
        }
        while(start1<=end1)//剩下的放到归并结果中
        {
            result[k++]=a[start1++];
        }
        while(start2<end2)//剩下的放到结果中
        {
            result[k++]=a[start2++];
        }
        for(k=start;k<=end;k++)//把结果一一赋值给原来的数组
        {
            a[k]=result[k];
        }
    }

}

总结

  • 归并排序是稳定排序
  • 它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。
  • java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。
  • 从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!