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

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

一.前言

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

一般有两种改法:

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. }

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

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

😍😁谢谢你的阅读。😸😼


目录
相关文章
|
5天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
5天前
|
算法 前端开发
前端算法之快速排序
前端算法之快速排序
14 0
|
5天前
|
算法
算法系列--递归(一)--与链表有关(上)
算法系列--递归(一)--与链表有关
28 0
|
5天前
|
算法
【免费】基于SOE算法的多时段随机配电网重构方法
【免费】基于SOE算法的多时段随机配电网重构方法
[数据结构]-玩转八大排序(二)&&冒泡排序&&快速排序
[数据结构]-玩转八大排序(二)&&冒泡排序&&快速排序
|
5天前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
11 0
|
5天前
数据结构第六课 -------迭代排序(快速排序和归并排序)
数据结构第六课 -------迭代排序(快速排序和归并排序)
|
5天前
数据结构——lesson11排序之快速排序
数据结构——lesson11排序之快速排序
|
5天前
|
搜索推荐 算法 Java
快速排序------一种优雅的排序算法
快速排序------一种优雅的排序算法
|
5天前
|
机器学习/深度学习 自然语言处理 算法
深度解析深度学习中的优化算法:从梯度下降到自适应方法
【4月更文挑战第28天】 在深度学习模型训练的复杂数学迷宫中,优化算法是寻找最优权重配置的关键导航者。本文将深入探讨几种主流的优化策略,揭示它们如何引导模型收敛至损失函数的最小值。我们将比较经典的批量梯度下降(BGD)、随机梯度下降(SGD)以及动量概念的引入,进一步探索AdaGrad、RMSProp和Adam等自适应学习率方法的原理与实际应用。通过剖析这些算法的理论基础和性能表现,我们旨在为读者提供一个关于选择合适优化器的参考视角。