快速排序的非递归实现
首先说明一下快速排序是对冒泡排序的改进。为什么这么说呢?想一下冒泡排序,它把序列分成了两部分,前半部分无序,后半部分升序排列,并且后半部分的数都大于前半部的数。
由此可得到快速排序和冒泡排序的一些共同点:
- 都要经历n趟排序
- 每趟排序要经历O(n)次比较
- 都是后半部分元素比前半部大
而不同之处就在于冒泡排序的交换操作发生相邻的元素之间,即一趟排序可以要经过多次交换操作;快速排序的交换操作发生在间隔比较远的两个元素之间,一趟排序要经过交换操作次数会少一些。
下面给出快速排序的递归和非递归实现代码:
#include<iostream>
#include<vector>
#include<stack>
#include<cstdlib>
#include<algorithm>
using
namespace
std;
/**把数组分为两部分,轴pivot左边的部分都小于轴右边的部分**/
template
<
typename
Comparable>
int
partition(vector<Comparable> &vec,
int
low,
int
high){
Comparable pivot=vec[low];
//任选元素作为轴,这里选首元素
while
(low<high){
while
(low<high && vec[high]>=pivot)
high--;
vec[low]=vec[high];
while
(low<high && vec[low]<=pivot)
low++;
vec[high]=vec[low];
}
//此时low==high
vec[low]=pivot;
|