C语言 实现归并排序算法

yizhihongxing

C语言实现归并排序算法的攻略如下:

展示归并排序算法思路

  1. 先将待排序的序列拆分成若干小规模子序列,直到每个子序列可以直接排序为止。
  2. 然后对每个子序列进行排序,合并成新的有序序列。
  3. 重复第二步,直到只剩下一个排序完毕的序列。

C语言代码实现

下面是一份C语言实现归并排序算法的代码,代码内部有详细的注释,可以帮助理解代码:

#include <stdio.h>

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];

    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];

    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++;
    }

    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }

    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 main() {
    int arr[] = {12, 11, 13, 5, 6, 7};
    int n = sizeof(arr)/sizeof(arr[0]);

    printf("Original array:\n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);

    mergeSort(arr, 0, n - 1);

    printf("\nSorted array:\n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");

    return 0;
}

示例说明

下面是两个排序示例:

示例1:

原数组: {55, 23, 26, 2, 55, 15}。

  1. 将原数组分成两个子序列:{55, 23, 26}和{2, 55, 15}。
  2. 对子序列{55, 23, 26}进行排序,得到{23, 26, 55}。
  3. 对子序列{2, 55, 15}进行排序,得到{2, 15, 55}。
  4. 将两个排序后的子序列合并,得到新的有序序列{2, 15, 23, 26, 55, 55}。

示例2:

原数组:{10, 15, 12, 13, 7, 11}。

  1. 将原数组分成两个子序列:{10, 15, 12}和{13, 7, 11}。
  2. 对子序列{10, 15, 12}进行排序,得到{10, 12, 15}。
  3. 对子序列{13, 7, 11}进行排序,得到{7, 11, 13}。
  4. 将两个排序后的子序列合并,得到新的有序序列{7, 10, 11, 12, 13, 15}。

以上就是C语言实现归并排序算法的完整攻略和两个示例说明。

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

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

相关文章

  • 使用C语言求解扑克牌的顺子及n个骰子的点数问题

    “使用C语言求解扑克牌的顺子及n个骰子的点数问题”,我们可以分别来看一下。 1. 求解扑克牌的顺子 首先我们需要了解什么是扑克牌的顺子,即五张连续的牌,如”10 J Q K A”等。因为一副牌里,最小的牌为2,最大的牌为A(即1),所以任何5张牌中最大和最小的差值不能超过4。 我们可以先将5张牌进行排序,然后用最大牌和最小牌计算差值,再去除所有大小王,如果差…

    算法与数据结构 2023年5月19日
    00
  • JS实现的全排列组合算法示例

    下面针对 “JS实现的全排列组合算法示例” 给出完整攻略。 什么是全排列组合算法? 全排列组合是指将一个集合中的元素排成一列,可以有不同的排列方式,这些不同的排列方式就称为全排列。当从这个集合中取出一部分排成一列时,称为排列,而取出一部分组合称为组合。 JS实现全排列组合算法的步骤 具体实现全排列组合算法的步骤如下: 定义需要排列和组合的数组或字符串; 定义…

    算法与数据结构 2023年5月19日
    00
  • 浅谈2路插入排序算法及其简单实现

    浅谈2路插入排序算法及其简单实现 概述 2路插入排序算法是插入排序算法的一种变体,其主要思想是将待排序数据集分成两个子序列,分别进行插入排序,最后将两个排好序的子序列合并成一个有序序列。2路插入排序算法比普通的插入排序算法在特定数据集下可以获得更好的排序效果。 实现思路 2路插入排序算法可以分为以下几个步骤: 将待排序数据集按照大小分成两个子序列,分别进行插…

    算法与数据结构 2023年5月19日
    00
  • javascript笛卡尔积算法实现方法

    JavaScript笛卡尔积算法实现方法 什么是笛卡尔积 笛卡尔积是指给定多个集合,每个集合中分别选取一个元素组成的所有可能组合的集合。例如,有两个集合 X={1,2} 和 Y={3,4},那么它们的笛卡尔积为 {(1,3), (1,4), (2,3), (2,4)}。 实现笛卡尔积算法 JavaScript实现笛卡尔积算法的过程可以分为以下三步: 遍历所有…

    算法与数据结构 2023年5月19日
    00
  • JS实现数组随机排序的三种方法详解

    JS实现数组随机排序的三种方法详解 在JavaScript中,实现数组的随机排序是十分常见的需求。本篇文章将讲解三种实现数组随机排序的方法。 方法一:Fisher-Yates算法 Fisher-Yates算法(也被称为 Knuth算法)是实现数组随机排序最常用的算法之一。该算法的思路很简单,即从数组末尾开始,将当前位置的数与它之前的任意一个数交换顺序,直到数…

    算法与数据结构 2023年5月19日
    00
  • 7种排序算法的实现示例

    针对“7种排序算法的实现示例”的完整攻略,我会提供如下内容: 标题:7种排序算法的实现示例 这是一个一级标题,用于明确文章的主题。 简介:介绍7种排序算法的基本概念和使用场景 在这里我会简介7种排序算法的基本概念和使用场景,以帮助读者快速了解文章主题。 内容:讲解7种排序算法的实现示例 在这个章节,我会具体讲解7种排序算法的实现示例。其中,每种排序算法会按一…

    算法与数据结构 2023年5月19日
    00
  • 排序算法图解之Java插入排序

    首先要了解什么是插入排序,插入排序是排序算法中简单直观的一种,其原理是将未排序的元素一个一个插入到已经排好序的元素中,最终得到一个有序的序列。那么下面我将用Java代码来演示插入排序的实现过程,并且提供详细的注释帮助读者理解。 算法步骤 从第一个元素开始,认为第一个元素是已经排好序的,取第二个元素和已排序的元素进行比较,如果第二个元素比已排序的元素小,则交换…

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

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

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