我们知道快递排序大部分的版本都是递归的方式来实现的:通过Pritation来实现划分,并递归实现前后的划分。由于同学上次百度二面面试官问起快速排序的非递归的实现方式,当时同学不会,因为我们大部分看到的都是递归方式来实现快速排序。并没有关注非递归的方式。但是仔细想想也是可以做的,因为递归的本质是栈,因此我们非递归实现的过程中,借助栈来保存中间变量就可以实现非递归了。在这里中间变量也就是通过Pritation函数划分之后分成左右两部分的首尾指针,只需要保存这两部分的首尾指针即可。

递归的方式显现如下:

首先贴出Pritation函数的实现,因为递归和非递归都需要用到该函数,该函数实现的版本有多种,这里采用我比较熟悉的。

 1 int Pritation(int* a, int left, int right)
 2 {
 3     if (a == NULL || left < 0 || right <= 0||left>=right)
 4         return -1;
 5     int priot = a[left];
 6     int i = left, j = right;
 7     while (i < j)
 8     {
 9         while (i > j&&a[j] >= priot)
10             j--;
11         if(i<j)
12             a[i]=a[j];
13         while (i < j&&a[i] <= priot)
14             i++;
15         if(i<j)
16             a[j]=a[i];
17     }
18     a[i] = priot;
19     return i;
20 }

  然后贴出递归的代码:(代码简洁明了)

 1 void QuickSort(int *a, int left,int right)
 2 {
 3     if (a == NULL || left < 0 || right <= 0 || left>right)
 4         return;
 5     int k = Pritation(a, i, j);
 6     //下面是递归实现的代码
 7     if (k > left)
 8         QuickSort(a, left, k - 1);
 9     if (k < right)
10         QuickSort(a, k + 1, right);
11 }

最后贴出非递归的实现方式:

 1 void QuickSort(int *a, int left,int right)
 2 {
 3     if (a == NULL || left < 0 || right <= 0 || left>right)
 4         return;
 5     stack<int>temp;
 6     int i, j;
 7     //(注意保存顺序)先将初始状态的左右指针压栈
 8     temp.push(right);//先存右指针
 9     temp.push(left);//再存左指针
10     while (!temp.empty())
11     {
12         i = temp.top();//先弹出左指针
13         temp.pop();
14         j = temp.top();//再弹出右指针
15         temp.pop();
16         if (i < j)
17         {
18             int k = Pritation(a, i, j);
19             if (k > i)
20             {
21                 temp.push(k - 1);//保存中间变量
22                 temp.push(i);  //保存中间变量
23             }
24             if (j > k)
25             {
26                 temp.push(j);
27                 temp.push(k + 1);
28             }
29         }
30
31     }
32
33 }

从上面的代码可以看出,保存中间变量的时候需要注意保存的顺序,因为栈是后进先出的方式。

转载于:https://www.cnblogs.com/ljy2013/p/4003412.html

快速排序的递归方式和非递归方式相关推荐

  1. 二分查找算法的两种实现方式:非递归实现和递归实现

    二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...

  2. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  3. 【排序】冒泡排序与快速排序(三个版本+非递归图示详解哦)

    全文目录 引言 冒泡排序 快速排序 思路 实现 Hoare版本 快排优化 挖坑法 前后指针法 快排非递归版本 思路 实现 总结 引言 在这篇文章中,将继续介绍排序算法:冒泡排序与快速排序: 它们都属于 ...

  4. 二叉树先中后序递归遍历与非递归遍历、层次遍历

    文章目录 1 先序遍历 1.1 先序遍历递归 1.2 先序遍历非递归 2 中序遍历 2.1 中序遍历递归 2.2 中序遍历非递归 3 后序遍历 3.1 后序遍历递归 3.2 后序遍历非递归 4 层序遍 ...

  5. 二叉树的递归遍历和非递归遍历实现(C++)(深度优先)

    二叉树的递归遍历和非递归遍历(C++) 二叉树的遍历方式可分为先序遍历,中序遍历和后序遍历 先序遍历:先遍历根节点,再遍历左子节点,最后遍历右子节点. 中序遍历:先遍历左子节点,再遍历根节点,最后遍历 ...

  6. 规范化的递归转换成非递归

    递归函数被调用时,系统需要一个运行栈.系统的运行栈要保存函数的返回地址,保存调用函数的局部变量,每一层递归调用所需保存的信息构成运行栈的一个工作记录,在没进入下一层递归调用是,系统就会建立一个新的工作 ...

  7. java 文件 递归_JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  8. 递归函数就兔子数C语言,【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)...

    意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡.问:一对兔子,一年能繁殖成多少对兔子?题中本 ...

  9. 递归转化成非递归过程_8086微处理器中的递归和重入过程

    递归转化成非递归过程 As we all know that a procedure is a set of instruction written separately which can be u ...

最新文章

  1. Request processing failed; nested exception is feign.RetryableException: Read timed out
  2. Java经典面试题整理及答案详解(四)
  3. 你对博客中提到的评分规则有何意见和建议?
  4. linux 内核dmesg,linux內核調試kmsg,dmesg
  5. update-rc.d 更新 Linux 系统启动项 命令 用法详解
  6. 2 MM配置-企业结构-定义-定义工厂代码
  7. 【kafka】kafka topic Dump log
  8. leetcode python3 简单题104. Maximum Depth of Binary Tree
  9. 精通Android开发 0
  10. oracle—新建用户
  11. mysql 计算15位身份证_15位身份证补全为18位身份证算法
  12. 天津工业大学计算机学院调剂信息,天津工业大学2019年硕士研究生调剂公告
  13. java时间转时间戳_java时间与时间戳互转
  14. Word和Excel中的常用办公操作
  15. Java每日一讲线程池的总结
  16. 【神经网络】神经网络发展趋势及研究热点
  17. ARIMA模型来预测股票数据
  18. SOI round0 题解
  19. 嵌入式软件开发之------浅析linux根文件系统挂载(九)
  20. 向量、矩阵乘法的几何意义(二) 矩阵乘法(Matrix Multiplication)

热门文章

  1. WebClient上传文件至服务器和下载服务器文件至客户端
  2. SQL SERVER数据库开发之触发器的应用
  3. css实现垂直居中(+水平居中)
  4. 力扣 有序数组的平方
  5. 借呗还款日都是一样吗?
  6. 网恋奔现发现对方长得很好看是什么样的体验?
  7. 抑郁症是不可告人的病吗?
  8. 丁克是什么意思,丁克家庭是什么意思,丁克家庭为什么越来越多
  9. 这两年亚马逊创业都是一个非常火热的话题
  10. 躺赚的意思不是做到高级别就觉得高枕无忧了