根据栈的性质后入先出,所以我们让5-8出栈: 跟上面一样,每次出栈对相应区间进行一次部分排序,排序完如下图: 因为在对这个区间进行部分排序时,67被选为key,此时67的右边已经全部比他大,所以排完序后不变,然后再将key的左区间和右区间分别入栈(注意此时的左区间和右区间加起来应该是5-8,因为我们是对5-8这个...
假设在理想情况下,每次递归都像二叉树那样,递归到最后面几层时,假设还剩7个数,我们还得递归7次,这样明显不好。我们就可以在最后几层时,使用其他排序方法进行。这里使用插入排序。 完整代码如下: 代码语言:javascript 复制 voidQuickSort(int*a,int begin,int end){if(begin>=end)return;if(end-begin+1<=10)...
3. 快速排序的非递归 — 使用栈 1.首先先来观察快排的递归实现(三种方法均可,这里用的"前后"指针法): 通过观察我们发现,每次递归调用传过去的是一个数组和一个区间,数组不用多说,这个区间就是我们的突破点。 也就是说我们要想一个方法来拿到每左右子区间,再对它们分别进行排序,这样才能模拟出递归的过程。那...
三、快速排序的非递归实现以及快排模板 3.1快排的非递归实现 快排的非递归应用场景是比较少的,因为快排也不是那么容易就爆栈,但是学习快排的非递归也能帮助我们更好地理解快排。 快排的非递归写法用C语言实现会相对复杂,因为快排的非递归需要利用栈来实现,但是C语言没有自己的STL库,所以要自己手写一个栈,相对比较麻...
快速排序一次可以确定一个值在正确的位置上。(这个值就是key值) 最常见的就是上面的递归代码,这是Hoare的一种方式实现快排。 Hoare思想:让基准值的右边先走,直到找到比基准值小的数,然后让左边走,直到找到比基准值大的数,然后交换,最后left=right相等的时候,将left位置的值与基准值交换。这样就实现了一次排序。
("输出非递归快速排序结果:\n");}//quick endvoid quick2(struct node a[20],int l,int h)//递归的快速排序{ int i; if(l<h) { i=hoare(a,l,h); quick2(a,l,i-1); quick2(a,i+1,h); }}//quick2 end///快速排序结束///堆排序函数///void heap(struct node a[20],int i,int...
一、什么是快速排序?二、快排的实现 1)三数取中:2)霍尔法快排实现:3)挖坑法快排实现:4)双指针快排实现:三、快排非递归实现 一、什么是快速排序?快速排序(QuickSort)采用的是 分治思想 ,即在一个无序的序列中选取一个任意的 基准元素pivot ,利用pivot将待排序的序列分成两部分,前面部分元素均小于或...
排序算法C语言实现——快速排序的递归和非递归实现 /*快排 - 递归实现 nlogn */ /* 原理: 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再...
于是我们可以先将Hoare版本、挖坑法和前后指针法的单趟排序单独封装起来。然后写一个非递归的快速排序,在函数内部调用单趟排序的函数即可。 1.Hoare版本 Hoare版本的单趟排序代码: //Hoare版本(单趟排序) int PartSort1(int* a, int left, int right) { int keyi = left;//key的下标 while (left < righ...
//快速排序(非递归实现)voidQuickSortNonR(int*a,intbegin,intend){Stackst;//创建栈StackInit(&st...