美文网首页
105. 两路合并排序

105. 两路合并排序

作者: 时光杂货店 | 来源:发表于2017-03-29 20:03 被阅读230次

基本思想

将有n个元素的序列看成是n个长度为1的有序子序列,然后两两合并子序列,得到n/2个长度为2或1的有序子序列;再两两合并,直到得到一个长度为n的有序序列时结束。

解题之法

template <class T>
void Merge (T A[], int i1, int i2, int j1, int j2){
    // i1, j1 是子序列1的上、下界,i2, j2是子序列2的上下界
    T *temp = new T[j2 - i1 + 1]; //分配能存放两个子序列的临时数组
    int i = i1, j = i2, k = 0;  // i,j是两个子序列的游动指针,k是temp的游动指针
    while (i <= j1 && j <= j2) {  // 若两个子序列都不空,则循环
        if (A[i] <= A[j])  // 将A[i] 和A[j]中较小的存入temp[k]
            temp[k++] = A[i++];
        else
            temp[k++] = A[j++];
    }
    while (i <= j1)                     // 若第一个子序列中还有剩余的就存入temp
        temp[k++] = A[i++];
    while (j <= j2)                     // 若第二个子序列中还有剩余的就存入temp
        temp[k++] = A[j++];
  
    for (i = 0; i < k; i++)             // 将临时数组中的元素倒回A
        A[i1++] = temp[i];

    delete[]  temp;
}
template <class T>
void MergeSort (T A[], int n){
    int i1, j1, i2, j2;  // i1, j1是子序列1的下上界,i2,j2是子序列2的下上界
    int size = 1;      // 子序列中元素个数,初始化为1
    while (size < n){
        i1 = 0;
        while (i1+size < n){ // 若i1 + size < n,则存在2个子序列,需要两两合并
            i2 = i1 + size;      // 确定子序列2的下界
            j1 = i2 - 1;           // 确定子序列1的上界
            if (i2 + size - 1 > n -1)
                j2 = n - 1;        // 若第2个子序列中不足size个元素,则置子序列2的上界j2 = n - 1
            else
                j2 = i2 + size - 1;  // 否则有size个,置 j2 = i2 + size - 1
            Merge(A, i1, j1, i2, j2);  // 合并相邻2个子序列
            i1 = j2 + 1;   // 确定下一次合并第一个子序列的下界
}
    size *= 2; // 元素个数扩大一倍
}
}

相关文章

  • 105. 两路合并排序

    基本思想 将有n个元素的序列看成是n个长度为1的有序子序列,然后两两合并子序列,得到n/2个长度为2或1的有序子序...

  • 排序算法☞java代码实现归并排序

    归并排序:归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用...

  • Java归并排序,代码,优缺点

    一. 概念 归并的含义是将两个或两个以上的有序表合并成一个新的有序表。大体分成,两路归并排序,和多路归并排序。用于...

  • leecode刷题(27)-- 合并k个排序链表

    leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表。请...

  • golang 写个快速排序

    快速排序是大多数语言内置 sort 函数的默认实现方式,简单可分为两路排序和三路排序,我在相关资料中,发现两路排序...

  • Python 排序算法汇总

    快速排序 合并排序

  • ARTS第五周2020620

    Algorithm 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例...

  • 合并K个排序链表【LeetCode:23】

    题目: 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: ...

  • Swift - LeetCode - 合并K个排序链表

    题目 合并K个排序链表 问题: 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 解题思路:...

  • LeetCode:合并K个排序链表

    合并K个排序链表(困难) 题目叙述: 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例...

网友评论

      本文标题:105. 两路合并排序

      本文链接:https://www.haomeiwen.com/subject/jqheottx.html