基本思想:
首先,从R[1]~R[n]中任取一个元素,以该元素的排序码为标准把n个元素分成左右两组,即左边一组中所有元素的排序码都不大于标准元素的排序码,右边一组中所有元素的排序码都不小于标准元素的排序码,并将该标准元素放到这两组的中间;然后,用同样的方法分别对这两组元素进行分组,如此反复进行,直到所有元素都被放到正确位置为止。
一次分组过程:
用第一个元素为标准进行分组,采用从两端往中间夹入的方式为该元素找插入位置
图示:
算法关键步骤:
1、定义算法partition(int i,int j,int &k),它以R[i]为标准元素,将R[i]~R[j]分成左右两组:R[i]~R[k]中所有元素的排序码都不大于R[k]的排序码,R[k]~R[j]中所有元素的排序码都不小于R[k]的排序码,并返回k值
2、定义递归算法quickSort(int i,int j):在i<j的情况下,先调用partition(i,j,k),然后递归调用quicksort(i,k-1)和quicksort(k+1,j)。
3、算法quickSort的初次调用形式为:quickSort(1,n)
代码:
方法一——:
//一次分组
void partition(int i,int j,int &k)
{
R[0]=R[i];
while(i<j){
while((i<j)&&(R[j].key>=R[0].key)) j--;
if(i<j) R[i++]=R[j];
while((i<j)&&(R[i].key<=R[0].key)) i++;
if(i<j) R[j--]=R[i];
}
R[i]=R[0];
k=i;
}
//递归的快速排序算法
void quicksort(int i,int j)
{
int k;
if(i<j){
partition(i,j,k);
quicksort(i,k-1);
quicksort(k+1,j);
}
}
//初次调用方式: quicksort(1,n);
方法二——:
void quicksort(vector<int>& v, int start, int end) {
if (start>= end)return;
int temp = v[start], i = start, j = end;
while (i < j) {
while (i<j && v[j]>temp)j--;
if (i >= j)break;
v[i] = v[j]; i++;
while (i < j && v[i] < temp)i++;
if (i >= j)break;
v[j] = v[i]; j--;
}
v[i] = temp;
quicksort(v, start, i - 1);
quicksort(v, i + 1, end);
}
注:
算法的平均执行时间是O(nlog2n),快速排序是不稳定的排序