首先要知道数组从大到小排列的充分必要条件:对于数组中任一个数,比它小的数在它左侧,比它大的数在右侧。那么我们只需将数组进行如下操作:
1.分解
以a[p]为基准,将比它小的移在a[p]后面 ,比它大的都放在a[p]的后面的后面。
如下图:
然后将比a[p]小的最后一个数与a[p]交换位置。
2.递归
将比a[p]小的数用以上步骤排序。
将比a[p]大的数用以上步骤排序。
用一个数组举例:
以上步骤可以分解为:
1.以3为基准,将比3小的移在3后面 ,比3大的都放在3的后面的后面。
2.将左半段按以上步骤排序。(递归。以2为基准后又以1为基准.......)
2.将右半段按以上步骤排序。(递归。以6为基准后又以5或4,5或4为基准.......)
源代码:
以 3,7,2,6,5,4,8,1 为例:
#include<iostream>
#include<algorithm>
using namespace std;
int Partition(int a[],int p,int r){
int i = p,j = r+1;
int x = a[p];
while(true){
while(a[++i]<x&&i<r);//a[i]比3大
while(a[--j]>x);//a[j]比3小
if(i<j){
swap(a[i],a[j]);
}
else{
break;
}
}
a[p] = a[j];
a[j] = x;
return j;
}
void quicksort(int a[],int p,int r){
if(p<r){
int q = Partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}
int main(){
int a[8] ={3,7,2,6,5,4,8,1};
quicksort(a,0,7);
cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]<<endl;
return 0;
}
输出结果: