• 归并排序精讲


    一.定义

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

    二.思路

    归并排序算法有两个基本的操作,一个是,也就是把原数组划分成两个子数组的过程。另一个是,它将两个有序数组合并成一个更大的有序数组。

    将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。
    将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。

    三.图解

    假设我们有一个初始数列为{8, 4, 5, 7, 1, 3, 6, 2},整个归并排序的过程如下图所示。

    分而治之

     

    合并两个有序数组流程

    再来看看阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

     四.代码

    1. void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex){
    2. int i = startIndex, j=midIndex+1, k = startIndex;
    3. while(i!=midIndex+1 && j!=endIndex+1) {
    4. if(sourceArr[i] > sourceArr[j])
    5. tempArr[k++] = sourceArr[j++];
    6. else
    7. tempArr[k++] = sourceArr[i++];
    8. }
    9. while(i != midIndex+1)
    10. tempArr[k++] = sourceArr[i++];
    11. while(j != endIndex+1)
    12. tempArr[k++] = sourceArr[j++];
    13. for(i=startIndex; i<=endIndex; i++)
    14. sourceArr[i] = tempArr[i];
    15. }
    16. //内部使用递归
    17. void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex) {
    18. int midIndex;
    19. if(startIndex < endIndex) {
    20. midIndex = startIndex + (endIndex-startIndex) / 2;//避免溢出int
    21. MergeSort(sourceArr, tempArr, startIndex, midIndex);
    22. MergeSort(sourceArr, tempArr, midIndex+1, endIndex);
    23. Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);
    24. }
    25. }
    26. int main(int argc, char * argv[]) {
    27. int a[8] = {50, 10, 20, 30, 70, 40, 80, 60};
    28. int i, b[8];
    29. MergeSort(a, b, 0, 7);
    30. for(i=0; i<8; i++)
    31. printf("%d ", a[i]);
    32. printf("\n");
    33. return 0;
    34. }

    看懂记得多加练习啊!!!

  • 相关阅读:
    使用imx 8m 测试matter协议功能
    js返回的promise对象有值,为什么返回里面的值就为““了呢
    Pycharm5个非常有用的技巧
    百乐钢笔维修(官方售后,全流程)
    [附源码]计算机毕业设计springboot新能源汽车租赁
    [python] Python日志记录库loguru使用指北
    【算法】直接插入排序解析
    IE11 使用的 DOM API (MutationObserver)
    RenderDoc图形调试器详细使用教程(基于DirectX11)
    不仅仅是图书信息管理系统
  • 原文地址:https://blog.csdn.net/wzxtsl/article/details/138095938