合并排序(C语言实现)

合并排序(C语言实现)

合并排序是一种将待排序序列分成多个子序列,分别进行排序,然后再将排序后的子序列合并成整体有序序列的排序算法。使用递归实现时,该算法的时间复杂度为O(nlogn),因此被广泛应用。

实现步骤

合并排序可以用以下步骤来实现:

  1. 分治:将待排序序列从中间分成两部分,递归地对左右两部分进行排序。
  2. 合并:将两个有序子序列合并成一个有序序列。

在实现该算法时需要用到指针,具体的实现步骤如下:

void merge(int arr[], int l, int m, int r) { 
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 =  r - m; 

    /* 创建临时数组 */
    int L[n1], R[n2]; 

    /* 拷贝数据到临时数组 L 和 R */
    for (i = 0; i < n1; i++) 
        L[i] = arr[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = arr[m + 1+ j]; 

    /* 按顺序合并临时数组到 arr[l..r] */
    i = 0; // 初始化第一个子数组的下标
    j = 0; // 初始化第二个子数组的下标
    k = l; // 初始化合并后子数组的下标
    while (i < n1 && j < n2) { 
        if (L[i] <= R[j]) {  // 如果左边的元素小于右边的元素,则将左边的元素放到合并后的数组中
            arr[k] = L[i]; 
            i++; 
        } 
        else {  // 否则,将右边的元素放到合并后的数组中
            arr[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 

    /* 拷贝 L[] 的保留元素 */
    while (i < n1) { 
        arr[k] = L[i]; 
        i++; 
        k++; 
    } 

    /* 拷贝 R[] 的保留元素 */
    while (j < n2) { 
        arr[k] = R[j]; 
        j++; 
        k++; 
    } 
} 

void mergeSort(int arr[], int l, int r) { 
    if (l < r) { 
        /* 计算中间位置*/
        int m = l+(r-l)/2; 

        // 递归地对左边进行排序
        mergeSort(arr, l, m); 
        // 递归地对右边进行排序
        mergeSort(arr, m+1, r); 

        // 合并排序过后的两个数组
        merge(arr, l, m, r); 
    } 
} 

示例说明

示例一

假设有以下待排序序列:

int arr[] = {12, 11, 13, 5, 6, 7}; 

对该数组进行合并排序,可以依次进行以下步骤:

  1. 首先调用 mergeSort(arr, 0, 5),将数组分成 arr[0..2]arr[3..5] 两部分,递归地对这两部分进行排序。
  2. 接着递归调用 mergeSort(arr, 0, 2)mergeSort(arr, 3, 5),分别对 arr[0..2]arr[3..5] 进行排序。
  3. 然后调用 merge(arr, 0, 2, 5),将排序后的 arr[0..2]arr[3..5] 合并成 arr[0..5]
  4. 最后得到的有序数组为 {5, 6, 7, 11, 12, 13}

示例二

假设有以下待排序序列:

int arr[] = {7, 2, 6, 3, 9}; 

对该数组进行合并排序,可以依次进行以下步骤:

  1. 首先调用 mergeSort(arr, 0, 4),将数组分成 arr[0..2]arr[3..4] 两部分,递归地对这两部分进行排序。
  2. 接着递归调用 mergeSort(arr, 0, 2)mergeSort(arr, 3, 4),分别对 arr[0..2]arr[3..4] 进行排序。
  3. 然后调用 merge(arr, 0, 2, 4),将排序后的 arr[0..2]arr[3..4] 合并成 arr[0..4]
  4. 最后得到的有序数组为 {2, 3, 6, 7, 9}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:合并排序(C语言实现) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解Bucket Sort桶排序算法及C++代码实现示例

    接下来我会详细讲解“详解Bucket Sort桶排序算法及C++代码实现示例”的完整攻略。 什么是桶排序算法? 目前,排序算法很多,常用的有冒泡排序、选择排序、插入排序、快速排序、归并排序等等算法。其中,桶排序(Bucket Sort)是比较特殊的一种排序方法。顾名思义,桶排序就是把数据分到不同的桶里,然后对每个桶里的数据进行排序。支持桶排序的数据类型必须是…

    算法与数据结构 2023年5月19日
    00
  • Python实现的最近最少使用算法

    Python实现最近最少使用算法 最近最少使用算法(Least Recently Used,LRU)是一种缓存淘汰策略,用于在缓存已满时选择要被淘汰的缓存块。该算法的基本思想是,当缓存已满时,淘汰最近最少使用的缓存块。 下面我们将通过python代码实现LRU算法的主要思想,并提供两个示例说明。 算法思路 LRU算法需要同时维护两个数据结构。 记录最近访问顺…

    算法与数据结构 2023年5月19日
    00
  • C语言实现单链表的快速排序算法

    下面是详细的攻略: 单链表快速排序算法的原理 在单链表上实现快速排序,需要了解快速排序算法的原理。快速排序是一种常用的基于比较的排序算法,它的基本思想是:选取一个基准元素(pivot),将数组分成两个部分,一个部分是小于基准元素的,一个部分是大于基准元素的。然后对这两个部分分别递归进行快排,最终得到排序后的数组。 在单链表上,选择基准元素也是一样的,不同的是…

    算法与数据结构 2023年5月19日
    00
  • java实现波雷费密码算法示例代码

    Java实现波雷费密码算法的步骤如下: 首先,下载并添加bcprov-jdk15on-168.jar的BouncyCastle加密库。下载地址:https://www.bouncycastle.org/latest_releases.html 打开Java IDE,并新建一个Java项目。 在项目中创建一个新的Java类,并将其命名为“BlowfishCip…

    算法与数据结构 2023年5月19日
    00
  • 如何用C++实现A*寻路算法

    一、什么是A*寻路算法? A寻路算法(A search algorithm),也叫A算法,是一种启发式搜索算法,常用于求解路径规划问题。A算法结合了Dijkstra算法和启发式搜索的优点,能够在保证找到最短路径的情况下,大大降低搜索的时间和空间消耗。 二、A*寻路算法的原理 1.最短路径 在计算机科学中,最短路径问题是指两点之间的所有路径中,经过的边或节点数…

    算法与数据结构 2023年5月19日
    00
  • C语言直接选择排序算法详解

    C语言直接选择排序算法详解 什么是选择排序算法 选择排序算法(Selection Sort)是一种简单直观的排序算法。该算法每次从未排序的数中选择最小(或最大)的一个数,将其放在已排序数列的末尾,直到所有数排序完成。因为该算法在每次排序后的下一轮排序不会再考虑之前选择的最小(或最大)值,所以属于不稳定排序算法。 算法流程 选择排序算法主要分为两个步骤: 在未…

    算法与数据结构 2023年5月19日
    00
  • Java桶排序之基数排序详解

    Java桶排序之基数排序详解 基本概念 基数排序(Radix Sort),又称桶排法(Bucket Sort),是一种非比较型整数排序算法。其思想是将一个数字序列拆分成多个数字进行比较排序,从个位开始,逐层进行排序,直到最高位排序完成。 实现步骤 初始化10个桶,代表数字0到9; 按照从低位到高位的顺序进行排序,首先比较个位,然后比较十位,以此类推,直到最高…

    算法与数据结构 2023年5月19日
    00
  • C语言 详细解析时间复杂度与空间复杂度

    C语言详解时间复杂度与空间复杂度 什么是时间复杂度和空间复杂度? 在计算机科学中,时间复杂度和空间复杂度用于衡量算法执行效率的指标。 时间复杂度指算法运行所需的时间,一般用大O记法表示,例如O(n)、O(n²),其中n代表输入数据规模。 空间复杂度指算法运行所需的存储空间,也一般用大O记法表示,例如O(n)、O(n²),其中n代表输入数据规模。 时间复杂度示…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部