首页 > 编程语言 >归并排序算法及C语言实现

归并排序算法及C语言实现

时间:2023-06-18 11:01:20浏览次数:55  
标签:归并 int 合并 C语言 数组 序列 排序

一、归并排序的原理

归并排序(Merge Sort)是一种基于分治思想的高效排序算法。其核心思想是将待排序的数组分为两个相等的部分,对这两个部分分别进行递归排序,最后将两个有序的子数组合并成一个有序的整体。可见归并排序的时间复杂度为 O(nlog2n)。

下面我们来详细地介绍一下归并排序的过程:

  1. 分解将待排序的数组递归分解为越来越小的子序列,直到分解成单个元素的子序列。
  2. 合并将相邻的两个单个元素的子序列进行合并,成为一个长度为 2 的有序子序列;接着,将相邻的两个长度为 2 的有序子序列合并,成为一个长度为 4 的有序子序列;以此类推,直到合并成一个完整的排好序的序列。

二、归并排序的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 merge_sort(int arr[], int l, int r){
    if (l < r) {
        int m = l + (r - l) / 2;

        // 分别递归排序左右两部分 
        merge_sort(arr, l, m);
        merge_sort(arr, m + 1, r);

        // 合并排序后的两部分 
        merge(arr, l, m, r);
    }
}

// 测试 
int main(){
    int arr[] = {38, 27, 43, 3, 9, 82, 10};
    int n = sizeof(arr)/sizeof(arr[0]);

    // 排序前 
    printf("Before sorting: ");
    for (int i = 0; i < n; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 排序 
    merge_sort(arr, 0, n - 1);

    // 排序后 
    printf("After sorting: ");
    for (int i = 0; i < n; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

输出结果如下:

Before sorting: 38 27 43 3 9 82 10 
After sorting: 3 9 10 27 38 43 82

以上代码中,merge 函数用于合并两个有序数组,merge_sort 函数是归并排序的主体函数,用于递归排序和合并数组。我们在 main 函数中使用了 merge_sort 对数组进行了排序。

标签:归并,int,合并,C语言,数组,序列,排序
From: https://blog.51cto.com/u_15903730/6507792

相关文章

  • C语言基础教程(动态内存分配)
    (文章目录)前言本篇文章来讲解C语言中的动态内存分配,在C语言中动态内存分配经常使用,合理的使用动态内存分配可以帮助我们节省代码空间,当然了不合理的使用可能导致程序的崩溃,或者是内存的泄漏。一、动态内存分配常用函数在C语言中,动态内存分配是一种在程序运行时分配和释放内......
  • C语言基础教程(宏的使用和多文件编程)
    (文章目录)前言这篇文章来给大家讲解一下C语言中的多文件编程,在C语言开发项目的过程中使用多文件编程是必不可少的,使用多文件编程可以方便我们代码的管理和编写,让我们的代码可读性和移植性更高。一、宏的定义和使用在C语言中,宏(Macro)是一种预处理指令,用于在编译阶段进行文本......
  • C语言的几种缺陷及其规避方法
    一、C语言的几种缺陷C语言作为一种老牌编程语言,在其诞生时代的背景下是十分先进的,为编程领域的发展做出了重要贡献。但是,随着计算机体系结构、软硬件环境的不断演进,C语言所存在的一些缺点也逐渐凸显出来。以下是C语言的一些缺陷:容易出现指针错误:C语言中广泛使用指针,而指针访问出错......
  • C语言-数据存储详解
     C语言类型内置类型整型家族char//字符数据类型1个字节unsignedcharsignedcharshort//短整型4个字节unsignedshort[int]signedshort[int]int//整型4个字节 unsignedint  signedint long//长整型8个字节unsignedlong[int] signedlong[int]longlong//更长......
  • C语言基础教学(文件操作)
    (文章目录)前言这篇文章我们来讲解C语言中的文件操作,文件操作在C语言中算是一个比较重要的知识点,我们每天都在和文件打交道,各种文件夹的打开和关闭操作,那么这篇文件带大家学习如何使用C语言中的文件操作来完成这个工作。一、文件操作基本介绍C语言提供了一组函数,可以用于进行......
  • C语言中的转义字符及注意事项
    在C语言中,转义字符是由一个反斜杠(\)和一个特定字符组成的组合。它们用于表示一些特殊的控制字符,例如在字符串中插入换行符或者制表符。当编译器遇到一个反斜杠时,它会将其后面的字符解释为一个转义字符,简单来说,转义字符就是反斜杠加上某个特定的字符,改变其原本含义,来表示另一个含义......
  • c语言练习
    3.C语言预备知识3.1字符常量题目:熟悉C语言程序的字符常量输出的基本编写源代码:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inta1=20,a2=345,a3=700,a4=22; intb1=56720,b2=9999,b3=20098,b4=2; intc1=233,c2=205,c......
  • python之冒泡排序
    冒泡排序原理:;两两比较,将(大、小)的元素往右移importrandoma=random.sample(range(0,10),4)#随机生成4个1到10之内的数字lenth=len(a)#获取长度print(a)#需要冒泡排序的列表#比较(趟数),最后一趟无需比较,所以减1forjinrange(lenth-1):#-1:最后一......
  • 逍遥自在学C语言 | 指针的基础用法
    前言在C语言中,指针是一项重要的概念,它允许我们直接访问和操作内存地址。可以说,指针是C语言一大优势。用得好,你写程序如同赵子龙百万军中取上将首级;用得不好,则各种问题层出不穷,有种双拳难敌四手的感觉。本文将介绍指针的基础知识,包括指针的定义、初始化、访问和运算。一、人物......
  • 一道有趣的平均计算排序题
    如图:如题:一眼扫过去,如果直接计算则计算量特别大,绝对浪费时间我们看下解析:傻子做法,且为什么易错选项是D?因为其他选项(很容易算出)依次是:B、A、B、C,唯一发现缺个D,于是大部分人蒙D这是典型脱离实际的计算资料分析重在分析!要结合实际生活进行分析!结合生活实际,显然工科平均毕......