-
快速排序算法的思想
首先选择一个关键值key,作为枢轴。一般会将数组的首个元素选定为key,枢轴。为什么说是枢轴?是因为待会我们要以这个key为界,把所有小于等于key值的数组元素放置到key的左侧;把所有大于等于key值的元素移到数组的右侧。key,充当了一个临界轴的作用,所以叫它枢轴并不为过。
定义两个变量,first,last,分别代表待排序序列的起始位置和结束位置。
不断重复这么一个过程:【从序列右侧开始(由last记录的位置),将数组中的元素与key值逐一比较,找到第一个比key小的元素,将其放置到first位置处;从序列左侧开始(由first记录的位置),将数组中的元素与jey值逐一比较,找到第一个比key大的元素,将其放置到last位置处】,直到first==last。通过上述的过程,可以实现把所有小于等于key值的数组元素放置到key的左侧;把所有大于等于key值的元素移到数组的右侧,这么一个功能。
现在以key枢轴为界,得到了两部分,key左边的所有元素都比key小,key右边的所有元素都比key大。那么怎么实现把数组中所有的元素都有序排列呢?似乎有人已经脱口而出了——利用递归。现在我把代码给大家,新手可以细细体悟。
-
快速排序的代码
//快速排序。
#include<iostream>
using namespace std;
void QuickSort(int a[], int low, int high){
if(low >= high){//递归的终止条件。
return;
}
int first = low;
int last = high;
int key = a[first];//一般用序列的第一个元素作为枢轴。
while(first < last){
while(first < last && a[last] >= key){
last--;
}
a[first] = a[last];//将第一个比key小的元素移到低处。
while(first < last && a[first] <= key){
first++;
}
a[last] = a[first];//将第一个比key大的元素移到高处。
}
a[first] = key;//枢轴元素记录到位。
QuickSort(a, low, first-1);//以枢轴为界划分两极。低一极。
QuickSort(a, first+1, high);//以枢轴为界划分两极。高一极。
}
int main()
{
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
QuickSort(a, 0, sizeof(a)/sizeof(a[0])-1);//快速排序
for(int i = 0; i < sizeof(a)/sizeof(a[0]); i++){
cout<<a[i]<<" ";
}
return 0;
}