当前位置:首页 » 《随便一记》 » 正文

【数据结构与算法】快速排序的非递归实现方法

27 人参与  2023年04月27日 12:10  分类 : 《随便一记》  评论

点击全文阅读


 

目录

一.前言

二.非递归实现


一.前言

如果数据量过大的话,不断递归就会出现栈溢出的现象,这个时候你的代码是没问题的,但就是跑不起来,这个时候就要把递归改成非递归。

一般有两种改法:

1.直接改,利用循环等;

2.借助栈的辅助。

而快速排序的非递归实现方法就需要借助栈的辅助。

二.非递归实现

通过观察我们发现,每次递归调用传过去的是一个数组和一个区间,数组自不用说,这个区间就是我们的突破点;

也就是说我们只要想办法在循环的时候拿到本次要排序的区间就行了,那要怎么做呢?

借助数据结构:栈,栈具有后进先出的特性,借助这个就能很好的解决问题。

1.首先要先把 left 和 right 入栈,这样栈此时就不为空,然后开始循环。

2.取出栈顶的两个数据,分别赋给 begin 和 end ,注意在这之后要pop掉取出的数据;

3.然后就是快排的逻辑,有三种方法,哪种都可以;

   如果不清楚这三种方法的话,请点击:快速排序的三种实现方法

   走完一趟后就得到了 keyi;

4.然后数组就被 keyi 分成了两个子区间,分别是:

     左区间:[begin,keyi-1]

     右区间:[keyi+1,end]

 分别将左区间和右区间入栈,注意这里要判断:

       a.keyi+1<end

       b.keyi-1>begin

否则会出现数组访问越界或是死循环的情况。

5.因为栈是后进先出,所以要是想先排左区间的话,就要先入右区间进栈,反之;

6.循环结束后,销毁栈。

void QuickSortNonR(Sdatatype* arr, int left, int right){ST st;Stackinit(&st);Stackpush(&st, right);Stackpush(&st, left);while (!Stackempty(&st))   //栈为空时就结束循环{int begin = Stacktop(&st);   //出一个就要pop掉一个数据Stackpop(&st);int end = Stacktop(&st);Stackpop(&st);int keyi = begin;    //以下为快速排序的逻辑,这里用的是前后指针法实现int mid = GetMid(arr, begin, end);if (mid != keyi)Swap(&arr[mid], &arr[keyi]);int prev = begin, cur = begin + 1;while (cur <= end){if (arr[cur] < arr[keyi]){prev++;Swap(&arr[cur], &arr[prev]);cur++;}elsecur++;}Swap(&arr[keyi], &arr[prev]);keyi = prev;   if (keyi + 1 < end)    //不要忘记判断{Stackpush(&st, end);    //这里是先入的右区间,所以是先排序左区间Stackpush(&st, keyi + 1);}if (keyi - 1 > begin){Stackpush(&st, keyi - 1);Stackpush(&st, begin);}}Stackdestroy(&st);   //销毁栈}

??本篇文章到此就结束了,若有错误或是建议的话,欢迎小伙伴们指出;?️?

??希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;??

??谢谢你的阅读。??

 


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/60069.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 小说年代知青看到弹幕,觉醒赢麻了(年代知青看到弹幕,觉醒赢麻了)已更新+无删减(年代知青看到弹幕,觉醒赢麻了)
  • 女总裁找了我三年,亲戚朝我逼婚无错版_小姨乔总过敏大反击_小说后续在线阅读_无删减免费完结_
  • 新章速递养大的反派疯魔了是什么小说(江曜姬时语)完本阅读无广告(江曜姬时语)
  • 爱,一触就破无广告_妹妹夏夏孟夏人气小说_小说后续在线阅读_无删减免费完结_
  • 他死后前妻疯魔了彩蛋(顾煜迟林筱棠)全书在线下载阅读完美终章小说大结局
  • 此后锦书休寄周窈音全文最新章节(周窈音)全文免费阅读无弹窗大结局_周窈音免费阅读
  • 弹幕说我是捞女?反手收购男主公司养鸡(林朝曦沈墨川)_弹幕说我是捞女?反手收购男主公司养鸡
  • 没给寡嫂抢到La******,老公把我和儿子做成蜡像(顾云州沈云烟)_没给寡嫂抢到La******,老公把我和儿子做成蜡像顾云州沈云烟
  • 出狱后,假千金靠玄术杀疯了(顾九音霍霆修)_出狱后,假千金靠玄术杀疯了
  • 养妹偷我认亲玉佩当上千金,男友当场分手超长版_玉佩陈雨柔养父母一口气看完_小说后续在线阅读_无删减免费完结_
  • 抽卡后,气运之子怎么都缠上来了小说(夏挽棠)(抽卡后,气运之子怎么都缠上来了)全书+后续+结局在线阅读
  • 前传爱意随风消逝续集:全文+番外乔清浅宋轻舟:结局+番外新上热文

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1