iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c语言递归和非递归排序怎么实现
  • 201
分享到

c语言递归和非递归排序怎么实现

2023-06-30 05:06:22 201人浏览 八月长安
摘要

本篇内容主要讲解“C语言递归和非递归排序怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言递归和非递归排序怎么实现”吧!递归代码流程归并就是把两个或多个序列合并,这里只介绍二路归并,就

本篇内容主要讲解“C语言递归和非递归排序怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言递归和非递归排序怎么实现”吧!

递归代码流程

归并就是把两个或多个序列合并,这里只介绍二路归并,就是不断的把序列分为2组,直到每个组有一个元素为止,然后再比较合并,直到合为1个序列,完成。

非递归代码流程

与递归不断分解数组相反,非递归直接从长度为1的子序列开始合并,直到全并为1个整个序列,复用了merge函数

两者比较

代码用非递归的方式效率更高一些:

空间复杂度:从O(log2n)变为1个临时数组O(n)

时间复杂度:少了递归的时间

时间复杂度

O(nlogn)

代码(递归)

#include <stdio.h>#include <stdbool.h>#define MAXSIZE 9typedef struct {    int r[MAXSIZE+1]; // first index used as tmp, not real data    int len;}sqlist;void swap(SqList *L, int i, int j) {    int tmp = L->r[i];    L->r[i] = L->r[j];    L->r[j] = tmp;}void merge(int sr[], int tr[], int s, int m, int t) {    // 本函数的任务就是比对sr中两个分组(s..m, m+1..t)的元素大小并归并到tr    int j,k,l;    j = m + 1; // 第2分组的起始位置    k = s; // k用于tr数组中的游标与sr中的起始位置对应起来    while (s<=m && j<=t) {        if (sr[s] < sr[j]) {            tr[k++] = sr[s++];        }        else {            tr[k++] = sr[j++];        }    }    // 只要是合并,就肯定至少是2个序列合并,肯定会在比对后剩下1个未消耗完元素的序列分组    while (s<=m) {        tr[k++] = sr[s++];    }    while (j<=t) {        tr[k++] = sr[j++];    }}void msort(int sr[], int tr[], int s, int t) {        int m;    int tmpr[MAXSIZE+1]; // 每层递归的临时数组,存放本次被调用时s到t归并后的下标值(位置与首次传入的L->r相同)    if (s == t) {        tr[s] = sr[s]; // 归并的思想,1个元素的分组为有序    }    else { // 不是1个元素的分组,继续分组        m = (s+t)/2;        msort(sr, tmpr, s, m);        msort(sr, tmpr, m+1, t);        // 合并tmpr到tr完成本层的排序任务        merge(tmpr, tr, s, m, t);    }}void merge_sort(SqList *L) {    msort(L->r, L->r, 1, L->len); // 因为在msort中第1个参数sr数组只是读取,所以这里这样传递没有问题}int main(void) {    SqList list = {        {999,50,10,90,30,70,40,80,60,20},        MAXSIZE    };    merge_sort(&list);    printf("after merge_sort:\n");    for (int i=0; i<=MAXSIZE; i++) {        printf("index: %d, value: %d\n",i,list.r[i]);    }    return 0;}

output

➜  c GCc sort_merge.c&& ./a.out
after merge_sort:
index: 0, value: 999
index: 1, value: 10
index: 2, value: 20
index: 3, value: 30
index: 4, value: 40
index: 5, value: 50
index: 6, value: 60
index: 7, value: 70
index: 8, value: 80
index: 9, value: 90
 

代码(非递归)

#include <stdio.h>#include <stdbool.h>#include <stdlib.h>#define MAXSIZE 9typedef struct {    int r[MAXSIZE+1]; // first index used as tmp, not real data    int len;}SqList;void merge(int sr[], int tr[], int s, int m, int t) {    // 本函数的任务就是比对sr中两个分组(s..m, m+1..t)的元素大小并归并到tr    int j,k,l;    j = m + 1; // 第2分组的起始位置    k = s; // k用于tr数组中的游标与sr中的起始位置对应起来    while (s<=m && j<=t) {        if (sr[s] < sr[j]) {            tr[k++] = sr[s++];        }        else {            tr[k++] = sr[j++];        }    }    // 只要是合并,就肯定至少是2个序列合并,肯定会在比对后剩下1个未消耗完元素的序列分组    while (s<=m) {        tr[k++] = sr[s++];    }    while (j<=t) {        tr[k++] = sr[j++];    }}void merge_pass(int sr[], int tr[], int k, int len) {    int i=1; // 合并时的游标    while (i < len-2*k+1) { // 也就是每次循环后,当前所剩余的是否还够2个完整子序列        merge(sr, tr, i, i+k-1, i+2*k-1); //合并本轮扫描到的2个子序列        i+=2*k; // 赋值后的i为下一轮2个子序列的起始位置    }    // 下面是扫尾工作,**可能会**出现2种情况,a. 剩余1~2个子序列之间的情况, b. 剩余<=1个子序列的情况    if (i < len-k+1) {        merge(sr, tr, i, i+k-1, len);    }    else { // 这里加else也可以 如果上面i正好把序列消耗完,则循环不会执行        while (i<len) {            tr[i] = sr[i];            i++;        }    }}void merge_sort(SqList *L) {    int *tr = (int *)malloc(L->len*sizeof(int));    int k=1;         while (k<L->len) {        merge_pass(L->r, tr, k, L->len); // 序列1变2        k++;        merge_pass(tr, L->r, k, L->len); // 序列2变4        k++;    }}int main(void) {    SqList list = {        {999,50,10,90,30,70,40,80,60,20},        MAXSIZE    };    merge_sort(&list);    printf("after merge_sort2:\n");    for (int i=0; i<=MAXSIZE; i++) {        printf("index: %d, value: %d\n",i,list.r[i]);    }    return 0;}

output

➜  c gcc sort_merge_norecursive.c&& ./a.out
after merge_sort2:
index: 0, value: 999
index: 1, value: 10
index: 2, value: 20
index: 3, value: 30
index: 4, value: 40
index: 5, value: 50
index: 6, value: 60
index: 7, value: 70
index: 8, value: 80
index: 9, value: 90

到此,相信大家对“c语言递归和非递归排序怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: c语言递归和非递归排序怎么实现

本文链接: https://www.lsjlt.com/news/327501.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言递归和非递归排序怎么实现
    本篇内容主要讲解“c语言递归和非递归排序怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言递归和非递归排序怎么实现”吧!递归代码流程归并就是把两个或多个序列合并,这里只介绍二路归并,就...
    99+
    2023-06-30
  • c语言排序之归并排序(递归和非递归)
    目录递归代码流程非递归代码流程两者比较时间复杂度代码(递归)代码(非递归)递归代码流程 归并就是把两个或多个序列合并,这里只介绍二路归并,就是不断的把序列分为2组,直到每个组有一个元...
    99+
    2022-11-13
  • C语言递归实现归并排序详解
    归并排序递归实现还是比较难理解的,感觉涉及递归一般理解起来都会比较有难度吧,但是看了b站视频,然后照着打下来,然后自己写了点注释,就发现不知不觉都大概懂了。 这里的归并讲的是升序排序...
    99+
    2022-11-13
  • 快速排序详解(递归实现与非递归实现)
    目录 一、快速排序的基本思想 二、将序列划分成左右区间的常见方法 2.1hoare版本(动图+解释+代码实现) 2.2挖坑法 2.3前后指针法 三、快速排序的初步实现 四、快速排序的优化实现 4.1快排的特殊情况 4.2对区间划分代码的...
    99+
    2023-10-24
    排序算法 算法 数据结构 c++
  • 详解C语言通过递归与非递归实现蛇形矩阵
    前言: 本次蛇形矩阵我将以两种方法来实现,即非递归和递归 非递归的实现: #define right 1 #define down 2 #define left 3 #defin...
    99+
    2022-11-13
  • C语言 递归实现排雷游戏
    目录前言一、游戏思路二、游戏框架 1.菜单界面1.菜单:2.菜单的选择:3.实际效果:2.游戏主体1.初始化雷盘及展示界面2.布置雷3.排雷3.游戏函数三、游戏运行四、所有代码1.g...
    99+
    2022-11-12
  • C语言非递归算法解决快速排序与归并排序产生的栈溢出
    目录1、栈溢出原因和递归的基本认识2、快速排序(非递归实现)3、归并排序(非递归实现)建议还不理解快速排序和归并排序的小伙伴们可以先去看我上一篇博客​​​​​​哦!C语言超详细讲解排...
    99+
    2022-11-13
  • C语言并查集的非递归实现详解
    目录【算法分析】【算法代码】并查集压缩路径非递归写法参考文章总结【算法分析】 经典的递归实现的并查集,在数据规模过大时,可能会爆栈,因此有了并查集的非递归实现。核心代码如下: i...
    99+
    2022-11-12
  • PHP怎么实现快速排序的非递归算法
    介绍快速排序是一种高效的排序算法,它通过不断地将一个数组分成两个子数组来实现排序。在快速排序算法中,一个基准值(pivot)被选出并所有小于基准值的元素放在其左侧,而所有大于基准值的元素放在其右侧。然后,这个过程被递归地应用在左右两侧的子数...
    99+
    2023-05-14
  • C++递归实现选择排序算法
    目录基本思想举例完整代码基本思想 每次找出最小元素,通过交换实现将其放在乱序的首位,直到所有元素都已经排好序。 举例 以 A[10] = { 3,1,6,4,8,2,10,7,9,5...
    99+
    2022-11-12
  • C语言中递归和排列组合详解
    目录排列组合三大问题:1.打印n个数的全排列2.打印n个数中任意m个数的全排列3.打印n个数中任意m个数的组合完整代码如下:总结排列组合三大问题: 1.打印n个数的全排列2.打印n个...
    99+
    2022-11-12
  • c语言全排列递归算法怎么应用
    C语言全排列递归算法可以应用于需要对给定的元素集合进行全排列的问题,例如求解一个字符串的所有排列。下面是一个简单的C语言全排列递归算...
    99+
    2023-09-08
    c语言
  • C语言递归实现扫雷游戏
    前言 首先要实现扫雷原理上同三子棋,都是通过一个二维数组来实现游戏主题功能那么这里有几个值得注意的点 1、初级扫雷我们知道是九乘九数组实现,那么在这里我们创建的是11乘11的数组,目...
    99+
    2022-11-12
  • C语言递归函数如何实现
    这篇文章主要介绍“C语言递归函数如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言递归函数如何实现”文章能帮助大家解决问题。一、递归的数学思想递归是一种数学上分而自治的思想递归需要有边界条...
    99+
    2023-06-30
  • c语言递归算法怎么应用
    C语言递归算法可以应用于解决各种问题,特别是涉及到递归结构的问题。以下是一些常见的应用场景:1. 数学问题:计算阶乘、斐波那契数列、...
    99+
    2023-10-07
    c语言
  • 怎么理c语言解递归算法
    这篇文章主要讲解了“怎么理c语言解递归算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理c语言解递归算法”吧!算法思路大家都知道,一个方法自己调用自己...
    99+
    2022-10-19
  • C语言中如何使用递归实现排雷游戏
    这篇文章主要介绍了C语言中如何使用递归实现排雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言扫雷,相信各位都不陌生,以前每台电脑上面都会自带这个小游戏。因此,它可以说...
    99+
    2023-06-25
  • c语言中递归字符串逆序输出怎么实现
    要实现递归字符串逆序输出,可以按照以下步骤进行:1. 定义一个递归函数,该函数接受一个字符串作为参数。2. 在递归函数中,首先判断字...
    99+
    2023-08-24
    c语言
  • C++二叉树的前序中序后序非递归怎么实现
    这篇“C++二叉树的前序中序后序非递归怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++二叉树的前序中序后序非递归...
    99+
    2023-07-05
  • C语言之快速排序算法(递归Hoare版)介绍
    废话不多说,先看代码 #define _CRT_SECURE_NO_WARNINGS 1 //快速排序算法,递归求解 #include <stdio.h> void ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作