当前位置: 首页 > news >正文

排序算法6---快速排序(非递归)(C)

        回顾递归的快速排序,都是先找到key中间值,然后递归左区间,右区间。

        那么是否可以实现非递归的快排呢?答案是对的,这里需要借助数据结构的。将右区间左区间压栈(后进先出),然后取出左区间,再将左区间的子右区间和子左区间压栈,再取出左区间的子左区间......,当栈为空时,即全部取出,此时已经有序。f2411c060f1945129eabf66cf4da911c.png

5b3c8442dda544c1a16c2f3b9d702693.png 

 

        和递归一样,首先用三数取中来优化:

//三数取中
int GetMidi(int* arr, int begin, int end)
{int midi = (begin + end) / 2;if ((arr[begin] > arr[midi] && arr[begin] < arr[end])|| (arr[begin]) > arr[end] && arr[begin] < arr[midi])midi = begin;if ((arr[end] > arr[midi] && arr[end] < arr[begin])|| (arr[end]) > arr[begin] && arr[end] < arr[midi])midi = end;return midi;
}

        接着借用递归快排的指针法,来进行单趟排序,得到中间基准值,并划分做右区间(不记得指针法的回看博客)

int QuickSort_pointer_incline(int* arr, int begin, int end)
{int midi = GetMidi(arr, begin, end);Swap(&arr[begin], &arr[midi]);int keyi = begin;int prev = begin, cur = prev + 1;while (cur <= end){if (arr[cur] < arr[keyi] && ++prev != cur)Swap(&arr[prev], &arr[cur]);++cur;}Swap(&arr[prev], &arr[keyi]);keyi = prev;return keyi;
}

        最后使用栈来压栈出栈

void QuickSort_NonR_incline(int* arr, int begin, int end)
{ST s;STInit(&s);//放入端点//因为后进先出,所以先入右,后入左,区间[左,右]STPush(&s, end);STPush(&s, begin);while (!STEmpyty(&s)){//出栈int left = STTop(&s);STPop(&s);int right = STTop(&s);STPop(&s);//指针单趟排序int keyi = QuickSort_pointer_incline(arr, left, right);//[left,keyi-1],keyi,[keyi+1,right]//入右区间,同样先入右区间的右端点,再左端点if (keyi + 1 < right){STPush(&s, right);STPush(&s, keyi + 1);}//入左区间,同样先入左区间的右端点,再左端点if (left < keyi - 1){STPush(&s, keyi - 1);STPush(&s, left);}//循环回去,又取出区间,再次单趟排序后,又入子右区间,子左区间}STDestroy(&s);
}

 

 

http://www.lryc.cn/news/281205.html

相关文章:

  • 【Verilog】期末复习——设计带异步清零且高电平有效的4位循环移位寄存器
  • 银行网络安全实战对抗体系建设实践
  • SwiftUI之深入解析Alignment Guides的超实用实战教程
  • java获取视频文件的编解码器
  • 动态规划Day06(完全背包)
  • selenium之框架之窗口
  • 华为OD机试 - 最小矩阵宽度(Java JS Python C)
  • 嵌入式linux_C应用学习之API函数
  • 【ubuntu】docker中如何ping其他ip或外网
  • 【Vue3+Ts项目】硅谷甄选 — 品牌管理+平台属性管理+SPU管理+SKU管理
  • 计算机图形学流体模拟 blender 渲染脚本
  • 二分图带权最大匹配-KM算法详解
  • Redis命令 - Sets命令组常用命令
  • DA14531-外设驱动篇-I2C通信应用
  • Git仓库管理笔记
  • [嵌入式软件][入门篇] 搭建在线仿真平台(STM32)
  • 设置5台SSH互免的虚拟机服务器配置
  • 深信服技术认证“SCCA-C”划重点:交付和运维体系
  • xlua源码分析(五) struct类型优化
  • iptables TEE模块测试小记
  • [IDE]vscode显示文件路径
  • facebook广告怎么设置受众人群
  • MySQL夯实之路-MVCC机制深入浅出
  • Java线上问题堆栈排查分析
  • C语言代码 计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!
  • 【RTOS】快速体验FreeRTOS所有常用API(4)队列
  • 【开题报告】基于SpringBoot的美食制作学习网站的设计设计与实现
  • Rosalind Java|Speeding Up Motif Finding
  • 打印的前后顺序
  • Android Retrofit使用详情