备案 控制台
开发者社区 云计算 文章 正文

【八大排序(六)】快排终极篇-快速排序非递归版

简介: 【八大排序(六)】快排终极篇-快速排序非递归版

💓博主CSDN主页: 杭电码农-NEO💓


⏩专栏分类: 八大排序专栏⏪


🚚代码仓库: NEO的学习日记🚚


🌹关注我🫵带你学习排序知识

  🔝🔝


1. 前情回顾

在学习快排非递归版前
我们要先了解快排的思想和栈的结构
可以跳转 快排初阶和 栈详解复习一下

非递归版的快排只是优化了递归函数
然而单趟快排所用的思想还是不变的
只不过将递归过程转化为了循环

注:本章单趟快排使用最左边做为基准值


2. 快排非递归基本思路

我们先定义一个无序数组:

int a[]={6,1,2,7,9,3,4,5,10,8};

一共十个元素,下标范围:0 ~ 9

基本思路:

  • 第一次快排要遍历下标0~9的元素
  • 将 0 和 9入栈后使用完再出栈
  • 假设第一趟快排分了两个子区间为
  • 0~ 4和6~ 9.将6,9入栈后再将0,4入栈
  • 栈顶为0,4,单趟快排就遍历下标为0~4
  • 使用完后0,4出栈,并且将子区间入栈
  • 以此类推直到栈中没有元素

画图理解:


3. 对非递归思路的解释

思考:

  1. 非递归的优势是什么?
  2. 为什么要用栈结构?
  3. 为什么右子区间要先入栈?
  4. 怎么判断左右子区间的小标范围?

解释:


非递归的优势是无论预排序数组多长
都不会产生栈溢出问题.
而递归层数太深,系统栈帧空间不足
就会发生栈溢出的错误


使用栈结构是由于栈的特殊性质:
栈后进先出的特性可以使数组:
左子区间全部排好序再排右子区间.
这和递归的过程保持一致.


如果入栈顺序乱来,也可以排好序
只不过代码和思想不容易被理解


我们设计每一次单趟排序返回
基准值所在位置对应的下标
而下标加一为右子区间的开始
下标减一为左子区间的截至

(注:单趟快排可以使用任意方法)

方法详解:

hoare办法

挖坑法,指针法


4. 单趟快排代码实现

我们假设这里使用指针法做单趟快排

前后指针法:

//单趟快排(前后指针版本)
int Partion3(int* a, int left, int right)
{
  //三数取中--面对有序的情况不会栈溢出(key不会选到最大或者最小的数)
  int mini = GetMidIndex(a, left, right);
  swap(&a[left], &a[mini]);
  int key = left;
  int prev = left;
  int cur = left + 1;
  while (cur <= right)
  {
    while (a[cur] >= a[key] && cur <= right)//cur指针找小于key的
    {
      ++cur;
    }
    if (cur <= right)
    {
      swap(&a[++prev], &a[cur]);
      cur++;//交换完后,cur要再往后走一步
    }
  }
  swap(&a[key], &a[prev]);// 最后交换prev和key的值
  return prev;//返回基准值的位置,方便下次递归
}

5. 快排非递归代码实现

非递归代码:

//快速排序(非递归)
void QuickSortNonR(int* a, int left, int right)
{
  ST st;
  StackInit(&st);
  StackPush(&st, left);
  StackPush(&st, right);
  while (!StackEmpty(&st))//当栈不为空时就继续
  {
    int end = StackTop(&st);//将栈顶元素赋值给下标遍历的尾
    StackPop(&st);//删除栈顶元素
    int begin = StackTop(&st);//再将新的栈顶元素给下标遍历的头
    StackPop(&st);//再把这个值删除
    int key = Partion3(a, begin, end);//单趟快排返回基准值对应位置下标
    if (key < end)
    {
      StackPush(&st, key + 1);
      StackPush(&st, end);
    }
    if (begin < key - 1)
    {
      StackPush(&st, begin);
      StackPush(&st, key);
    }
  }
  StackDestroy(&st);
}

6. 总结思考

总的来说,学计算机专业的同学
掌握快速排序是必须的.
但是大部分人都只会递归版本的快排

如果在面试的时候你现场给面试官

手撕一个非递归的快速排序

那么你一定会在人群中脱颖而出!


🔎 下期预告:归并排序初级篇 🔍


杭电码农-NEO
目录
相关文章
Sessy
|
19天前
|
算法 Java
<八大排序>万字详解(Java实现).插入排序、希尔排序、堆排序、快速排序、归并排序、计数排序...
<八大排序>万字详解(Java实现).插入排序、希尔排序、堆排序、快速排序、归并排序、计数排序
Sessy
12 0
叫我龙翔
|
1月前
|
算法 搜索推荐
【六大排序详解】中篇 :选择排序 与 堆排序
选择排序可以用扑克牌理解,眼睛看一遍所有牌,选择最小的放在最左边。然后略过刚才排完的那张,继续进行至扑克牌有序。这样一次一次的挑选,思路很顺畅。总结为: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
叫我龙翔
20 6
ForcibleBugMaker
|
1月前
|
算法 数据处理 C语言
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
ForcibleBugMaker
52 2
唐唐思
|
1月前
|
人工智能 搜索推荐
【hoare基础版】快速排序算法(1)
【hoare基础版】快速排序算法(1)
唐唐思
50 0
杭电码农-NEO
|
10月前
|
算法 搜索推荐
【八大排序(七)】归并排序初级篇-递归版
【八大排序(七)】归并排序初级篇-递归版
杭电码农-NEO
44 0
program_learner
|
6月前
|
搜索推荐 算法
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(下)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(下)
program_learner
36 0
program_learner
|
6月前
|
搜索推荐 算法 C语言
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
program_learner
45 0
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
小小unicorn
|
7月前
|
算法 搜索推荐
八大排序--------(五)堆排序
八大排序--------(五)堆排序
小小unicorn
18 0
木子斤欠木同
|
8月前
|
搜索推荐 算法
深入浅出排序算法之直接插入排序(拓展:折半插入排序)
深入浅出排序算法之直接插入排序(拓展:折半插入排序)
木子斤欠木同
53 0
遇事问春风乄
|
9月前
|
存储 算法 搜索推荐
【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序
【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序
遇事问春风乄
56 0

热门文章

最新文章

  • 1
    优酷中后台前端解决方案-总览
  • 2
    流计算风云再起 - PostgreSQL携PipelineDB力挺IoT(物联网), 大幅提升性能和开发效率
  • 3
    PyODPS 安装常见问题解决
  • 4
    读取excel文件后计算指定行列笛卡儿积并写出
  • 5
    Hibernate 里一些常用操作
  • 6
    10.2-10.3 datetime与时间格式的相互转换
  • 7
    Netty重要概念介绍
  • 8
    联想确认再次裁员 称调整主要分布在海外
  • 9
    阿里2016财报:强调正全力发展云计算等为四大业务
  • 10
    STL - 常用关联容器代码 - set & multiset
  • 1
    基于SpringBoot+Vue+uniapp的民宿预订系统的详细设计和实现(源码+lw+部署文档+讲解等)
    41
  • 2
    《500 Lines or Less》(13)—— A 3D Modeller
    35
  • 3
    基于SpringBoot+Vue+uniapp的电子书阅读器系统的详细设计和实现(源码+lw+部署文档+讲解等)
    29
  • 4
    基于SpringBoot+Vue的母婴全程服务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    34
  • 5
    基于SpringBoot+Vue的招投标管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    31
  • 6
    基于SpringBoot+Vue的失物招领系统的详细设计和实现(源码+lw+部署文档+讲解等)
    28
  • 7
    基于SpringBoot+Vue的高校科研信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    28
  • 8
    基于SpringBoot+Vue+uniapp的电影信息推荐APP的详细设计和实现
    30
  • 9
    基于SpringBoot+Vue+uniapp的课程考勤及作业提交App的详细设计和实现
    25
  • 10
    基于SpringBoot+Vue+uniapp的宠物饲养管理APP的详细设计和实现
    27
  • 相关电子书

    更多
  • 图解算法小抄
  • 低代码开发师(初级)实战教程
  • 阿里巴巴DevOps 最佳实践手册
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司南平百度关键词包年推广价格本溪seo排名公司河源建站价格重庆网站推广工具价格宁波网络推广推荐德阳百搜标王公司怀化网站设计报价昭通网站设计模板多少钱民治设计公司网站推荐海南seo网站优化哪家好宜宾百度关键词包年推广推荐廊坊网络推广价格坑梓建站公司广元网站设计模板报价铁岭网页制作哪家好杭州网站优化按天收费哪家好垦利建站报价绍兴seo多少钱辽阳建设网站价格景德镇网页设计推荐雅安网站制作坪地网站开发哪家好吉祥百度网站优化报价平凉高端网站设计价格萍乡网页设计推荐宿州优秀网站设计价格黄石网站开发价格兴安盟至尊标王怒江企业网站设计价格清徐网站搭建公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化