/*lijingjing
快速排序
它的平均时间复杂度为O(NlogN)
主要思想为,分治定义第一个数为基数,使其左面小于基数,右面大于基数,在分别在其左面和右面重复上述过程
*/
#include<iostream>
using namespace std;
int a[10]={1,3,5,7,9,2,4,6,8,10};
void Point(int left, int right)//开始位置,结束位置
{
int i=left;
int j=right;
int z=a[left];
int t;
if(left>right)
return;
while(i!=j)//在ij相等之前交换小于基数和大于基数的值
{//为保证其左边为小于基数的值,右边为大于基数的值,规定i<j,若不规定则会陷入循环
while(a[j]>=z && i < j)//从右往左找小于基数的值,找到则停止
j--;
while(a[i]<=z && i < j)//从左往右找大于基数的值,找到停止
i++;
if(i<j)//交换大于和小于基数的值
{
t=a[i];a[i]=a[j];a[j]=t;
}
}
//将基数和ij相等时的数交换
a[left]=a[i];
a[i]=z;
//继续执行基数的左面和右面
Point(left,i-1);
Point(i+1,right);
}
int main()
{
Point(0,9);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}
https://blog.csdn.net/pengzonglu7292/article/details/84938910