一、非递归实现快速排序 代码语言:cpp 复制 voidQuickSortNonR(int*a,intbegin,intend){ST s;STInit(&s);STPush(&s,end);STPush(&s,begin);while(!STEmpty(&s)){intleft=STTOP(&s);//先拿出来STPop(&s);intright=STTOP(&s);//后拿出来STPop(&s);//单躺排序,一次调整,得到中间keyi值,划...
2.第一次出栈: 每次出栈,对出栈的下标区间进行一次部分排序,这里的部分排序,就是选出key,将其放在正确的位置有3种实现方法,如有不懂可以看我上一期博客,这里我选的是双指针法。第一次出栈进行第一趟部分排序后,数组的元素变为如下图: 此时的key也就是45就被放在了正确的位置,也就是左边的元素都比它小,右...
在非递归版本下,对处理子任务(2,9)时会将该任务从栈中pop出来,而递归版本则不会pop出quick_sort(2,9)的栈帧,函数quick_sort(2,3)执行完后还会再次回到函数quick_sort(2,9),然后接着调用函数quick_sort(4,9)。 而之所以非递归实现可以提前将子任务(2,9)从栈中弹出是因为递归版本下所有递归调用都位于函...
利用快速排序每次是递归向左右子序列中进行排序,利用栈我们可以把左右子序列的端点值保存到栈中,然后每次取栈顶区间进行排序,直到栈为空则整个序列为有序 2.示例 (1)已有一组数据,对其进行排序 (2)创建好一个栈,此时第一次入栈的是上面这组数组的首位位置 (3)进入循环,取出栈里面的数组范围的元素,然后进行第...
○3.1 利用人工栈来实现递归 ○3.2 实现代码 ●四、快速排序总结 ○快速排序的特性总结: 一、为什么要掌握非递归 递归来实现快排虽然很简单但是堆栈的消耗很大,所以掌握非递归不仅可以避免递归调用的开销。还能来以此来检验我们的递归能力 在有些场景限制递归深度的时候,例如在嵌入式系统或对递归深度有限制的环境中,非...
在快速排序的过程中,通过一趟划分,可以把一个待排序区间分为两个子区间,然后分别对这两个子区间施行同样的划分。栈的作用是在处理一个子区间时,保存另一个区间的上界和下界。这个功能利用队列可以实现,只不过是处理子区间的顺序有所变动而己。 ⑵ 在非递归实现快速排序时,可根据基准把待排序区间分割为两个区间。
快速排序递归实现: 先看一下,这个《数据结构教程》李春葆 第5版,提供的代码(语言是C/C++),递归版的(简练),原理就不解释了: void QuickSort(RecType R[],int s,int t) {//对R[s]至R[t]的元素进行快速排序 int i=s,j=t; RecType tmp; ...
递归版快速排序的实现 Hoare版快速排序 写完了第一层之后,其他的工作就轻松多了,就是运用递归,每层递归时,需要调整left和right的值。这个过程和二叉树的前序遍历非常相似,以下就是完整的hoare版的快速排序: void Swap(int* x, int* y){int tmp = *x;*x = *y;*y = tmp;}void QuickSort1(int* a, ...
本节用非递归算法来实现快速排序算法,通常非递归算法用栈来实现,本节先介绍使用栈的非递归算法,然后介绍一个不使用栈的非递归算法。 1.使用栈的非递归算法 使用栈的非递归算法编码如下。 /** 快速排序算法的使用栈的非递归算法函数 @param SORTTABLE *pTable——排序表指针 ...
简介:【非递归版】快速排序算法(4) 前面学习了三种版本的递归快排。面试的时候也经常考察非递归版的快排。考察非递归其实也是在考察递归,因为递归与非递归是有相似之处。不是递归神似递归。 QuickSortNonR快速排序 在数据量过大的情况下,递归版的快排还是会出现栈溢出的现象。要考虑用其他空间实现快排。