合并排序(C语言实现)

yizhihongxing

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

相关文章

  • C++实现堆排序示例

    下面就详细讲解一下“C++实现堆排序示例”的完整攻略。 什么是堆排序 堆排序是一种树形选择排序方法,它是通过将待排序的序列构建成一个堆,在堆中,全局最大或最小的元素总是位于根节点,根节点最大或最小的元素会被输出到一个新的序列中,再将剩余的元素重新构建成堆进行下一轮循环,直到所有元素均被输出为止。 实现步骤 堆排序主要有两个步骤:构建堆和调整堆。 构建堆 将待…

    算法与数据结构 2023年5月19日
    00
  • JS中数据结构与算法—排序算法(Sort Algorithm)实例详解

    以下是关于“JS中数据结构与算法—排序算法(Sort Algorithm)实例详解”的完整攻略。 简介 数学中有一种重要的问题是如何将一组数据按照一定的规则有序排列。排序算法(Sort Algorithm)就是解决这种问题的一种算法。 在JS中,包含了许多排序算法的实现,包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。了解和掌握这些算法,有助于…

    算法与数据结构 2023年5月19日
    00
  • C语言常见排序算法之交换排序(冒泡排序,快速排序)

    交换排序主要有两种:冒泡排序和快速排序。下面我将分别详细介绍这两种排序算法的原理、过程和示例。 冒泡排序 原理 冒泡排序是一种基本的排序方法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复操作直到排序完成。 过程 冒泡排序的过程可以被描述如下: 比较相邻的元素。如果第一个比第二个大,就交换它们两个。 对每一对相邻元素做…

    算法与数据结构 2023年5月19日
    00
  • PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)

    当我们需要进行字符串比较时,通常会使用PHP中的strcmp()函数。但是,如果比较的字符串中包含数字,则会出现问题。举个例子,如果我们将”file9.txt”和”file10.txt”进行比较,strcmp()函数会认为”file10.txt”小于”file9.txt”,因为在ASCII码中,数字1比数字9要小。 为了解决这个问题,PHP提供了一个自然排序…

    算法与数据结构 2023年5月19日
    00
  • 详解C++实现链表的排序算法

    详解C++实现链表的排序算法 算法介绍 链表是一种常见的数据结构,在实际使用中常常需要对链表进行排序。本文将介绍在C++中实现链表排序的几种算法,包括插入排序,归并排序和快速排序。 插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法。具体实现过程如下: 遍历链表,取下一个节点作为插入节点。 如果当前节点不小于插入节点,则将插入节点插入…

    算法与数据结构 2023年5月19日
    00
  • 图解Java排序算法之快速排序的三数取中法

    图解Java排序算法之快速排序的三数取中法 什么是快速排序 快速排序是一种常见的排序方法,它的特点是在待排序的记录序列中,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分的记录关键字均比另一部分的关键字小。 快速排序的基本流程 快速排序的基本流程如下: 从数列中挑出一个元素,称为“基准”(pivot)。 对数列重新排序,将比基准值小的元素放在基准前面…

    算法与数据结构 2023年5月19日
    00
  • 纯python实现机器学习之kNN算法示例

    首先我们需要清楚kNN算法的基本思想。kNN算法是一种基于实例的有监督学习算法,可以用于分类和回归问题。对于一个新的未标记数据,该算法会根据其与训练集中数据的距离,找到距离该点最近的k个点,然后根据这k个点的标签或者值来对该点进行分类或回归。 以下是具体实现步骤: 准备数据 kNN算法需要一个已经标记好的训练数据集。这里我们以Iris花卉数据集为例。我们先把…

    算法与数据结构 2023年5月19日
    00
  • 分布式架构Redis中有哪些数据结构及底层实现原理

    分布式架构Redis中有哪些数据结构及底层实现原理 Redis支持的数据结构包括:字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 字符串(String) 字符串是Redis最基础的数据类型,与Java中的String类似,适用于存储任意二进制数据,可以存储字符串、数字、二进制数据等类型的数据。…

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