• Java排序算法 归并排序


    归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

    归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))的额外空间,时间复杂度为O(nlog(n)),算法不是自适应的,不需要对数据的随机读取。

    工作原理:

    1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

    2、设定两个指针,最初位置分别为两个已经排序序列的起始位置

    3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

    4、重复步骤3直到某一指针达到序列尾

    5、将另一序列剩下的所有元素直接复制到合并序列尾

    代码实现:

    1. public void mergeSort(){    
    2. long[] workSpace new long[nElems];    
    3. recMergeSort(workSpace,0,nElems-1);    
    4.    
    5. private void recMergeSort(long[] workSpace, int lowerBound, int upperBound){    
    6. if(lowerBound == upperBound){    
    7. return   
    8.    
    9. else   
    10. int mid=(lowerBound+upperBound)/2   
    11. recMergeSort(workSpace, lowerBound, mid);    
    12. recMergeSort(workSpace, mid+1upperBound);    
    13. merge(workSpace, lowerBound, mid+1upperBound);    
    14.    
    15.    
    16. private void merge(long[] workSpace, int lowPtr, int highPtr, int upperBound){    
    17. int 0   
    18. int lowerBound lowPtr;    
    19. int mid highPtr 1   
    20. int upperBound-lowerBound+1   
    21. while(lowPtr<=mid&&highPtr<=upperBound){    
    22. if(theArray[lowPtr]<theArray[highPtr]){    
    23. workSpace[j++]=theArray[lowPtr++];    
    24.    
    25. else   
    26. workSpace[j++]=theArray[highPtr++];    
    27.    
    28.    
    29. while(lowPtr<=mid){    
    30. workSpace[j++] theArray[lowPtr++];    
    31.    
    32. while(highPtr<=upperBound){    
    33. workSpace[j++] theArray[highPtr++];    
    34.    
    35. for(j=0;j<n;j++){    
    36. theArray[lowerBound+j]=workSpace[j];    
    37.    
    38.  

    归并排序是比较稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.

  • 相关阅读:
    2. Redis哨兵、复制、集群的设计原理与区别
    1. 详解Redis的存储类型、集群架构、以及应用场景
    博客园主题优化
    【Java基础】Java面试题精选
    【Java集合】——集合类分析总结
    新零售供应链的三大闭环
    Comparable和Comparator比较实现排序 场景分析
    Java基础-枚举类
    Java基础-泛型
    微服务架构~BFF和网关
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314432.html
Copyright © 2020-2023  润新知