排序算法之二路归并排序

简介: 二路归并排序         二路归并排序是采用的分而治之的思想。将一个待排序的序列分成两个序列,分别对这两个序列排序。而对于这两个序列排序的方式也是还之前一样,将这两个序列分别分成两个序列分别排序。一直这样分割下去,知道序列中没有元素或者已有一个元素为止。因为没有元素的序列和只有一个元素的序列定是一个有序的序列,所以相当于将这个序列排序完毕,向上返回。返回的过程中做的最重要的一件事就是

二路归并排序

        二路归并排序是采用的分而治之的思想。将一个待排序的序列分成两个序列,分别对这两个序列排序。而对于这两个序列排序的方式也是还之前一样,将这两个序列分别分成两个序列分别排序。一直这样分割下去,知道序列中没有元素或者已有一个元素为止。因为没有元素的序列和只有一个元素的序列定是一个有序的序列,所以相当于将这个序列排序完毕,向上返回。返回的过程中做的最重要的一件事就是将两个有序的序列合并成一个有序的序列。

        所以归并排序最重要的两步是分割和合并。

        例如:序列{50, 90, 30, 70, 40, 80, 60, 20}。这个序列进行二路归并排序的过程如下图所示:


int MergeSort(datatype *array, int low, int high)
{
    int i, j, k;
    int mid;
    int *temp;

    if(array == NULL) {
        return -1;
    }

    if(low >= high) {
        return -1;
    }
//辅助数组存两个数组有序之后合并成为的一个有序的数组
    temp = (int *)malloc(sizeof(int)*(high-low+1));
    if(temp == NULL) {
        return -1;
    }

    mid = (low + high) / 2;

//递归调用归并排序去是分割成的两个序列有序
    MergeSort(array, low, mid);
    MergeSort(array, mid+1, high);

//下面的程序是将两个有序的序列合并为一个有序的序列
    i = low;
    j = mid+1;
    k = 0;
//i指向第一个数组当前的比较值,j指向第二个数组的比较值
    while(i <= mid && j <=high) {
//比较i指向的值和j指向的值,将比较小的赋值给temp
        if(array[i] < array[j]) {
            temp[k++] = array[i++];
        } else {
            temp[k++] = array[j++];
        }
    }

//当i依旧小于mid时,相当于第一个序列还有剩余的一个或多个数据
//这些数肯定都是大于第二个序列的所有的数的。将这些数全部依次赋值给temp
    while(i <= mid) {
        temp[k++] = array[i++];
    }

//当j依旧小于high时,相当于第一个序列还有剩余的一个或多个数据
//这些数肯定都是大于第一个序列的所有的数的。将这些数全部依次赋值给temp
    while(j <= high) {
        temp[k++] = array[j++];
    }

//将temp中所保存的整个有序的序列赋值到原先序列的对应位置中
    for(i = 0; i <= high-low; i++) {
        array[low+i] = temp[i];
    }

    return 0;
}
 

目录
相关文章
|
3月前
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
28天前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
36 0
|
4月前
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
28 0
|
28天前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
17 0
|
2月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
65 4
|
2月前
|
算法 搜索推荐 C#
|
3月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
35 3
|
3月前
|
算法
数据结构与算法-归并排序
数据结构与算法-归并排序
24 2
|
4月前
|
存储 搜索推荐 算法
归并排序算法深入解析
归并排序算法深入解析
|
3月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
21 0