首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用递归在C中合并排序

在C语言中使用递归进行合并排序是一种常见的排序算法。合并排序是一种分治算法,它将待排序的数组分成两个子数组,然后递归地对这两个子数组进行排序,最后将两个已排序的子数组合并成一个有序的数组。

下面是一个使用递归实现合并排序的示例代码:

代码语言:txt
复制
#include <stdio.h>

// 合并两个有序数组
void merge(int arr[], int left, int mid, int right) {
    int i, j, k;
    int n1 = mid - left + 1;
    int n2 = right - mid;

    // 创建临时数组
    int L[n1], R[n2];

    // 将数据复制到临时数组
    for (i = 0; i < n1; i++)
        L[i] = arr[left + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[mid + 1 + j];

    // 合并临时数组到原数组
    i = 0;
    j = 0;
    k = left;
    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 left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;

        // 递归地对左右两个子数组进行排序
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        // 合并两个有序数组
        merge(arr, left, mid, right);
    }
}

int main() {
    int arr[] = {9, 5, 7, 2, 4, 1, 6, 8, 3};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原数组:");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);

    mergeSort(arr, 0, n - 1);

    printf("\n排序后的数组:");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);

    return 0;
}

这段代码中,merge()函数用于合并两个有序数组,mergeSort()函数用于递归地进行合并排序。在main()函数中,我们定义了一个待排序的数组arr,然后调用mergeSort()函数对其进行排序,并输出排序后的结果。

合并排序的时间复杂度为O(nlogn),其中n是待排序数组的大小。它是一种稳定的排序算法,适用于各种规模的数据集。

腾讯云提供了多种云计算相关产品,例如云服务器、云数据库、云存储等。您可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的详细信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • ES 如何使用排序

    Elasticsearch 排序是一项重要的功能,它允许我们按照特定的字段或条件对搜索结果进行排序。通过合理使用排序,我们可以更方便地找到所需的信息。...ES 提供了多种方式来指定排序字段和顺序。最常见的方式是查询请求中使用`sort`参数。我们可以指定要排序的字段,并指定升序或降序排序。...我们可以根据多个字段进行排序,并且可以为每个字段指定不同的排序顺序。 ES 还允许我们对排序进行微调。 例如,我们可以设置排序的权重,以确定不同字段排序的重要性。...实际应用排序使用需要考虑以下几个因素: 1. 用户需求:了解用户对搜索结果的期望排序方式,以便提供最相关和有用的结果。 2....总之,ES 排序功能为我们提供了强大的工具,使我们能够根据各种需求对搜索结果进行灵活的排序。通过合理使用排序,我们可以提高搜索的效率和准确性,为用户提供更好的体验。

    77810

    C语言数据结构】排序(快速排序及多种优化|递归及非递归版本)

    今日更新了快速排序的内容 欢迎大家关注点赞收藏⭐️留言 交换排序 快速排序 快排的过程图如下: hoare版代码呈现 void QuickSort(int* a, int begin,int...快排优化 三数取中法选key 递归到小的子区间时,可以考虑使用插入排序 三数取中法 快排对于有序的数据,效率不是很高。 如上图,我们前面的快排是固定选key的,也就是左边第一幅图,效率很低。...我们就可以最后几层时,使用其他排序方法进行。这里使用插入排序。...但不同的版本,单趟排序后的结果可能会不同。...先模拟递归左边,像二叉树递归那样,先入右边的数,再入左边,这样出的时候就先出左边的,然后就可以模拟先往左边递归了。

    18510

    C语言快速排序(非递归)图文详解

    前言:   上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?...答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构的栈来模拟实现递归的过程。...思路图分析:   因为使用c语言写的,所以需要我们自己写一个栈,栈的实现我这里不再过多赘述,我会把栈的码放在最后。假如我们现在有下面这组数组,我们要对它进行排序。...(注意下面的数字代表下标) 好,接下来开始用栈模拟递归:(图中栈的数字均表示下标) 1.第一次入栈: 将整个数组入栈,也就是下标为0-8 2.第一次出栈: 每次出栈,对出栈的下标区间进行一次部分排序,...现在就不难感受出,这其实是模拟递归的过程。

    10510

    数据结构排序——详细讲解归并排序c语言实现递归及非递归

    上次是快排和冒泡:数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意) 今天为大家带来归并排序 1.基本思想 归并排序是一种分治算法,它将序列分成两个子序列,分别对子序列进行排序...,然后将排序好的子序列合并起来。...合并子序列的过程,需要比较两个子序列的元素,并按顺序将它们合并成一个有序序列 注意:归并排序的关键在于合并两个有序的子序列,这一步需要额外的空间来存储中间结果。...实际的实现,可以使用递归或非递归的方式来完成归并排序 2.递归实现 递归归并排序: 如果序列长度小于等于1,无需排序,直接返回 将序列分成两个子序列,分别进行递归归并排序 合并两个已排序的子序列...非递归实现归并排序是一种迭代式的排序算法,它避免了递归调用带来的额外开销,通常使用循环和迭代来实现归并排序的过程: 确定归并区间的思路:对于给定的数组,首先将相邻的元素两两归并(gap=1),然后将归并的区间长度不断扩大

    18410

    C++经典算法题-合并排序

    40.Algorithm Gossip: 合并排序法 说明 之前所介绍的排序法都是同一个阵列排序,考虑今日有两笔或两笔以上的资料,它可能是不同阵列的资料,或是不同档案的资料,如何为它们进行排序...解法 可以使用合并排序法,合并排序法基本是将两笔已排序的资料合并并进行排序,如果所读入的资料尚未排序,可以先利用其它的排序方式来处理这两笔资料,然后再将排序好的这两笔资料合并。...排序的精神是尽量利用资料已排序的部份,来加快排序的效率,小笔资料的 排序较为快速,如果小笔资料排序完成之后,再合并处理时,因为两笔资料都有排序了,所有合并排序时会比单纯读入所有的资料再一次排序来的有效率...那么可不可以直接使用合并排序法本身来处理整个排序的动作?而不动用到其它的排序方式?...不过基本上分割又会花去额外的时间,不如使用其它较好的排序法来排序小笔资料,再使用合并排序来的有效率。 下面这个程式范例,我们使用快速排序法来处理小笔资料排序,然后再使用合并排序法处理合并的动作。

    43300

    Istio 合并监控指标

    大致翻译一下:这是一个缺省开放的功能,可以安装时用 --set meshConfig.enablePrometheusMerge=false 参数停用这个功能。...再结合相关代码,大概可以推断其功能大致如下: 网格化微服务在网格化之前使用 prometheus.io 注解标注的抓取方法,会被保存到 Sidecar 的环境变量之中; 合并指标功能,能够将被网格劫持的微服务输出的...我们用 Python 的 Prometheus Exporter SDK 的测试代码做一个示例应用,并使用如下 Dockerfile 进行打包: FROM python:3.9.13-slim-buster...会看到指标是一些请求相关和 Python 特定的内容,这正像我们一个提供了监控指标的微服务,那么如何将这些“业务”指标和 Sidecar 合并输出呢?...可以看到,指标已经被合并到了 Sidecar 指标之中。

    1.1K20

    快速排序算法思路分析和C++源代码(递归和非递归)

    快速排序由于排序效率同为O(N*logN)的几种排序方法效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试喜欢考这个。...快速排序C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。...*********************************** 效率分析:   快速排序的时间主要耗费划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。   ...快排空间复杂度:通常情况下为O(log2n),需要使用深O(log2n)的栈实现递归,如果是最坏情况的话,很显然就要O(n)的空间了。...*********************************** 应用场景:   快排算法一般应用在排序,但是分治法的思想应用广泛,比如在《剑指Offer》, 题40:最小的k个数和题39:数组中出现次数超过一半的数字均用到了分治法的思想

    1.5K70

    C++fstream_使用

    C++处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。...作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将文件 包括进来以使用任何fstream。...如果只执行输入,使用ifstream类;如果只执行输出,使用 ofstream类;如果要对流执行输入和输出,使用fstream类。可以将文件名称用作构造函数参数。...被打开的文件程序由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。...http://www.cplusplus.com/reference/fstream/fstream/列出了fstream可以使用的成员函数。

    5.5K10

    C】函数和递归使用

    数学我们常见到函数的概念。但是你了解C语言中的函数吗?...2、 C语言中函数的分类: 库函数 为什么会有库函数? 我们知道我们学习C语言编程的时候,总是一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。...我们开发的过程每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。...递归函数设计,可以使用 static 对象替代 nonstatic 局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保存递归调用的中间状态...尝试非递归代码: 逻辑是a+b=c,即前两个数的和等于第三个数 运用循环 每计算一次后将b的值赋给a,将c的值赋给b,再计算a+b的值赋给c 代码如下: //非递归 int fib(n)

    22920

    C#基础排序算法

    C#基础排序算法 大家好,我是苏州程序大白。今天是五一假最后一天了。大家做好上班的准备了吗???五一大家去哪里玩了。评论区分享下。不多说了。下面讲讲C#基本的排序算法。...排序算法 人们日常生活中所接触到的绝大多数数据都是经过排序的. 比如, 按照字母顺序查询字典. 或者按照名字的字母顺序电话本查询电话号码....最好的实现方法就是使用随机数生成器来给数组的每个元素进行赋值. C#中用Random 类可以产生随机数. 这种类型的对象可以产生随机数....检验排序过程 开发算法的过程可能要做的事情之一就是程序运行期间观察代码的中间结果. 使用Visual Studio. NET 的时候, 可以用IDE 自带的调试工具来实现....然后, 将最小的元素放置第 0 个位置上, 接着再从第1 个位置开始重复以上操作, 一直到第N-1个元素完成这种选择排序后才终止. 。 选择排序算法中使用了两层循环.

    74720

    排序算法JDK的应用(二)快速排序

    作者|杨旭 来源|https://blog.csdn.net/Alex_NINE 改进后的快速排序 分析上述代码时,可以发现程序会在特殊的情况调用sort()方法即改进后得快速排序,接下来就来分析sort...Therefore in float and 因此单双精度的排序算法我们必须使用更加精确的赋值即a[less]=a[great] * double...使用5个排序好的元素的第三个作为枢轴元素 * This value is inexpensive approximation of the median....sort()的源码部分,总结一下主要有以下几个要点 当待排数组的长度小于47时就会直接使用插入排序 选择五个均匀间隔的元素作为使用不同快速排序方法的判断标准 如果五个元素互不相等那么使用双轴快速排序(两个枢轴为...e2和e4) 否则使用只有一个枢轴值(e3)进行排序,但是这里还是把待排序数组分成了三个部分分别是大于,等于和小于枢轴的区域 结语 写了好久终于把这篇博客写好了,过程查了好多的资料看了好多的博客,不过最后还是把这个坑填上了

    1.1K30
    领券