归并排序

导语

归并排序,顾名思义,先递归分解数列,再进行合并,是分治策略非常典型的应用。假设初始序列含有 n 个元素,则可看做是n个有序的子序列,每个子序列的长度为1, 然后两两合并,得到 n/2 个长度为 2 或为 1 的子序列;再两两合并,……,如此重复,直至得到一个长度为 n 的有序序列为止。

归并排序的核心思想是将两个有序序列合并为一个序列,代码如下:

void mergeArray(int *array, int first, int middle, int last) {
    int length = last - first + 1;
    int temp[length], i = first, j = middle + 1, k = 0;
    while (i <= middle && j <= last) {
        if(array[i] >= array[j]) {
            temp[k++] = array[j++];
        } else {
            temp[k++] = array[i++];
        }
    }
    
    while (i <= middle) {
        temp[k++] = array[i++];
    }
    
    while (j <= last) {
        temp[k++] = array[j++];
    }
    k = 0;
    for (int t = first; t <= last; t++, k++) {
        array[t] = temp[k];
    }
}

接下来递归调用:

void mergeSort(int *a, int first, int last) {
    if (first < last) {
        int middle = (first + last) / 2;
        mergeSort(a, first, middle);
        mergeSort(a, middle + 1, last);
        mergeArray(a, first, middle, last);
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 数据结构与算法--归并排序 归并排序 归并排序基于一种称为“归并”的简单操作。比如考试可能会分年级排名和班级排名,...
    sunhaiyu阅读 1,008评论 0 6
  • 归并排序 所谓归并,就是将两个或两个以上的有序表合并成一个新的有序表。如下图所示,有两个已经排好序的有序表A[1]...
    JackChen1024阅读 2,479评论 0 4
  • 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非...
    NEXTFIND阅读 1,055评论 0 0
  • 归并排序 百度上的解释:归并排序:是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide ...
    半月迎风阅读 727评论 0 4
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,357评论 0 2

友情链接更多精彩内容