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

相关文章

  • 利用explain排查分析慢sql的实战案例

    对于利用explain排查分析慢SQL的实战案例,可以按照以下步骤进行。 1. 获取慢SQL 首先要获取慢SQL,即执行时间较长的SQL语句。可以在MySQL的慢查询日志中查看,也可以使用一些监控工具进行查看。获取慢SQL之后,可以通过一些工具进行格式化,让其更加可读。 2. 使用explain解析SQL 在获取慢SQL之后,接下来就是使用explain对S…

    算法与数据结构 2023年5月19日
    00
  • C语言实现冒泡排序算法的示例详解

    C语言实现冒泡排序算法的示例详解 冒泡排序是一种简单但效率较低的排序算法。它重复遍历要排序的数列,每次比较相邻两个元素,如果顺序不对就交换两元素顺序。该算法的时间复杂度为 O(n^2)。 以下是C语言实现冒泡排序的示例代码: #include <stdio.h> int main() { int arr[] = {5, 3, 8, 6, 4}; …

    算法与数据结构 2023年5月19日
    00
  • 通俗易懂的C语言快速排序和归并排序的时间复杂度分析

    通俗易懂的C语言快速排序和归并排序的时间复杂度分析 前言 快速排序和归并排序是常用的排序算法,它们不仅简单易懂,而且时间复杂度也相对较低。本文将从时间复杂度的角度出发,详细讲解C语言快速排序和归并排序的实现原理以及分析其时间复杂度。 注:本文中所涉及的代码示例是基于C语言实现的,若您对C语言不太熟悉,建议先学习一下。 快速排序 快速排序是一种分治算法,用于对…

    算法与数据结构 2023年5月19日
    00
  • JS深入学习之数组对象排序操作示例

    《JS深入学习之数组对象排序操作示例》是一篇介绍JavaScript数组排序相关操作的文章,主要包含以下内容: 1. 数组对象排序 1.1 sort()方法 sort()方法是JavaScript中的一个数组排序方法,可以用于对数组的元素进行排序。sort()方法可以接收一个可选的排序函数作为参数,通过这个函数,我们可以实现自定义的排序规则。 语法为:arr…

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

    C++插入排序算法实例详解 什么是插入排序算法? 插入排序算法是一种简单直观的排序算法,其基本思想是将待排序的数据插入已排序序列的合适位置,以达到排序的目的。该算法的时间复杂度为 O(N^2),适用于数据量较小的排序场景。 插入排序算法的基本步骤 插入排序算法的基本步骤可以归纳为以下三个: 将待排序序列的第一个元素视作已排序序列,将后面的元素逐个与已排序序列…

    算法与数据结构 2023年5月19日
    00
  • MySQL order by与group by查询优化实现详解

    MySQL的order by与group by是常用的查询优化手段,本篇攻略将详细讲解order by与group by的使用方法及其优化实现。 1. MySQL Order By MySQL Order By 用于对查询结果进行排序,将查询结果按照指定字段的顺序进行排列 ,默认升序排序,也可以指定为降序排序。 SELECT column1, column2…

    算法与数据结构 2023年5月19日
    00
  • C#实现冒泡排序算法的代码示例

    这里是详细讲解「C#实现冒泡排序算法的代码示例」的完整攻略。 算法简介 冒泡排序算法通过不断比较相邻的两个元素,将大的元素慢慢“冒泡”到数组的末尾,最终得到一个从小到大排列的有序数组。 计算机科学领域的算法大多数都有多种实现方式,这里我们介绍最基础的一种冒泡排序算法实现方式。 C# 实现代码示例 以下是 C# 实现冒泡排序算法的代码示例: public st…

    算法与数据结构 2023年5月19日
    00
  • C#七大经典排序算法系列(下)

    《C#七大经典排序算法系列(下)》是一篇文章,通过介绍七种经典的排序算法,帮助读者更好地理解排序算法的原理和操作,并且让读者掌握这些算法的基本实现方法。本文将会细致地讲解每种算法的思路、时间复杂度以及使用场景,希望读者能在阅读后掌握七种排序算法的差异和选用方法。 文章包含七种排序算法,分别为:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序和希尔排序…

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