合并排序(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日

相关文章

  • python中的插入排序的简单用法

    下面是Python中插入排序的简单用法攻略: 1. 什么是插入排序 插入排序是一种简单的排序算法,它的基本思想是将未排序的元素依次插入到已排序的有序序列中的合适位置,以此完成排序。插入排序的时间复杂度为O(n^2),通常用于小规模数据的排序。 2. 插入排序的Python实现 以下是插入排序的Python代码实现: def insertion_sort(da…

    算法与数据结构 2023年5月19日
    00
  • c++插入排序详解

    c++插入排序详解 1. 插入排序算法介绍 插入排序法是一种简单直观的排序方法。它的基本思路是通过每次将一个待排序的元素按照其大小插入到已经排好序的一组元素中,直到全部元素插入完毕,即排序完毕。 在实际应用中,对于较小的数据集,插入排序通常比快速排序和归并排序等复杂度为O(nlogn)的算法执行效率更高。 2. 插入排序算法的实现 下面给出一个C++实现的插…

    算法与数据结构 2023年5月19日
    00
  • C++中二叉堆排序详解

    C++中二叉堆排序详解 什么是二叉堆排序 二叉堆是一种特殊的二叉树,它有两个特性: 根节点的键值是所有节点中最小/最大的; 对于节点i的键值一定不大/小于它的父节点i/2。 根据第二个规则,我们可以对于任何一个节点i,以i为根的子树都是一个小根堆/大根堆。将二叉堆中最小/最大的根节点取出,然后将最后一个节点放到根位置,再对根节点进行一次向下调整的操作,就可以…

    算法与数据结构 2023年5月19日
    00
  • C#实现的二维数组排序算法示例

    接下来我将为大家详细讲解“C#实现的二维数组排序算法示例”的完整攻略。 什么是二维数组排序算法? 二维数组是一种常见的数据结构,是一个表格状(行列)的数组。而排序算法则是把一组无序的数据按照规定的排序方式进行排列的算法。二维数组排序算法是在二维数组基础上进行排序操作的算法。 C#实现二维数组排序算法示例 下面我们来看看如何用C#实现二维数组排序算法的示例: …

    算法与数据结构 2023年5月19日
    00
  • Python实现选择排序

    当我们需要对一个列表或数组进行排序时,选择排序是一种简单易懂的方法。Python是一种非常流行的编程语言,它可以轻松实现选择排序。 以下是Python实现选择排序的攻略: 选择排序的原理 选择排序是一种简单直观的排序算法,其基本思想是每次选择出最小的元素,放到已经排好序的部分的末尾。 实现步骤 找到未排序部分的最小元素; 将其放在已排序部分的末尾; 重复步骤…

    算法与数据结构 2023年5月19日
    00
  • 如何利用Python动态展示排序算法

    首先,我们需要了解一下Python中常用的用于动态展示的库——matplotlib和pygame。 matplotlib是一个数据可视化库,它可以让我们轻松地创建各种静态和动态的图形,包括折线图、柱形图等等,而pygame则是一个开源的游戏开发库,它专用于创建游戏和动态图形。 接下来,我们就可以使用这两个库来展示排序算法了。 下面是一个示例,展示了如何使用m…

    算法与数据结构 2023年5月19日
    00
  • javascript中可能用得到的全部的排序算法

    Javascript中可能用得到的全部排序算法 在JavaScript中,排序算法是非常常见和重要的。因为在编写程序时,我们经常需要对数组、集合等数据结构进行排序操作。接下来,我将按照常用的一些排序算法逐一介绍。 冒泡排序(Bubble Sort) 冒泡排序是一种简单的交换排序算法。它通过相邻两个元素的比较和交换来排序。每一轮比较都会将最大的元素沉到最底部。…

    算法与数据结构 2023年5月19日
    00
  • python计数排序和基数排序算法实例

    Python计数排序和基数排序算法实例攻略 计数排序和基数排序是排序算法中比较高效的一类算法,适用于整数排序,具有时间复杂度O(n+k)的优秀特性。本文将为大家详细讲解Python中计数排序和基数排序算法实现的完整攻略。 1. 计数排序算法实现 计数排序的核心思想是统计每个数在序列中出现的次数,然后通过累加计算出每个数所在的位置。具体实现步骤如下: 找到序列…

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