#include <iostream>
#include <time.h>
using namespace std;
int Postion(int A[],int p,int r)
{
int i=p-1; //分割线分割两个集合
int x=A[r]; //主元
for(int j=p;j<=r-1;j++)
{
if (A[j]<=x) //注意不要写成j了!!
{ //A[j]<x可不可以??
i++; // i+1位置为大数,将较小的数替换过来
int t;
t=A[j];A[j]=A[i];A[i]=t;
}
//不管是哪个集合中的数,j都要++
}
int t1;
t1=A[i+1];A[i+1]=A[r];A[r]=t1; //此时不要用x替换
//最后将将主元与最左边的大数交换
return i+1;
}
void QuickSort(int A[],int p,int r) //快速排序
{
if (p<r) //只要有数就能进行快速排序
{
int q;
q=Postion(A,p,r); //将r位置的元素(主元)来区分两个不同的集合
//即小于等于主元部分和大于主元部分
QuickSort(A,p,q-1); //前半部分进行快速排序
QuickSort(A,q+1,r); //后半部分进行快速排序
}
}
int main()
{
int number[20]={0};
int i;
srand((unsigned)time(NULL));
for(i=0;i<20;i++)
{
number[i]=rand()%100;
cout << number[i] << " ";
}
cout<< endl;
QuickSort(number,0,19);
for(i=0;i<20;i++)
{
cout << number[i] << " ";
}
cout<< endl;
return 0;
}
/*
1.一个数组通过主元来区分小于与大于它的数的集合
2.将主元插入到分割点中
3.将小于其部分和大于其部分的分别重复进行1,2操作,直至操作的两端差值为0停止
*/