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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 【数据结构与算法】快速排序的非递归实现方法

一.前言

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

一般有两种改法:

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.循环结束后,销毁栈

1. void QuickSortNonR(Sdatatype* arr, int left, int right)
2. {
3.  ST st;
4.  Stackinit(&st);
5. 
6.  Stackpush(&st, right);
7.  Stackpush(&st, left);
8.  while (!Stackempty(&st))   //栈为空时就结束循环
9.  {
10.     int begin = Stacktop(&st);   //出一个就要pop掉一个数据
11.     Stackpop(&st);
12.     int end = Stacktop(&st);
13.     Stackpop(&st);
14.     int keyi = begin;    //以下为快速排序的逻辑,这里用的是前后指针法实现
15.     int mid = GetMid(arr, begin, end);
16.     if (mid != keyi)
17.       Swap(&arr[mid], &arr[keyi]);
18.     int prev = begin, cur = begin + 1;
19.     while (cur <= end)
20.     {
21.       if (arr[cur] < arr[keyi])
22.       {
23.         prev++;
24.         Swap(&arr[cur], &arr[prev]);
25.         cur++;
26.       }
27.       else
28.         cur++;
29.     }
30.     Swap(&arr[keyi], &arr[prev]);
31.     keyi = prev;   
32.     if (keyi + 1 < end)    //不要忘记判断
33.     {
34.       Stackpush(&st, end);    //这里是先入的右区间,所以是先排序左区间
35.       Stackpush(&st, keyi + 1);
36.     }
37.     if (keyi - 1 > begin)
38.     {
39.       Stackpush(&st, keyi - 1);
40.       Stackpush(&st, begin);
41.     }
42.   }
43. 
44.   Stackdestroy(&st);   //销毁栈
45. }

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

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

😍😁谢谢你的阅读。😸😼


目录
相关文章
|
10月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
300 6
|
10月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
661 0
|
11月前
|
机器学习/深度学习 数据采集 传感器
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
685 0
|
9月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
414 0
|
9月前
|
机器学习/深度学习 算法 物联网
基于遗传方法的动态多目标优化算法
基于遗传方法的动态多目标优化算法
|
算法 搜索推荐
快速排序-数据结构与算法
快速排序(Quick Sort)是一种基于分治法的高效排序算法。其核心思想是通过选择基准(pivot),将数组划分为左右两部分,使得左侧元素均小于基准,右侧元素均大于基准,然后递归地对左右两部分进行排序。时间复杂度平均为 O(n log n),最坏情况下为 O(n²)(如数组已有序)。空间复杂度为 O(1),属于原地排序,但稳定性不佳。 实现步骤包括编写 `partition` 核心逻辑、递归调用的 `quickSort` 和辅助函数 `swap`。优化方法有随机化基准和三数取中法,以减少最坏情况的发生。
789 13
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
2624 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
441 7
|
存储 算法 安全
SnowflakeIdGenerator-雪花算法id生成方法
SnowflakeIdGenerator-雪花算法id生成方法
631 1

热门文章

最新文章