#include<iostream>
#include<vector>
using namespace std;
//快排思想:找到一标准值 比标准值小的都放在左侧 比标准值大的 都放在右侧
int _Find(int arr[],int nlow,int nhigh)
{
int temp; //保存标准值
temp = arr[nlow];
while(nlow<nhigh)
{
//从后向前找比标准值小的
if(arr[nhigh]<temp)
{
//放在前面的坑里
arr[nlow] = arr[nhigh];
nlow++;
break;
}
nhigh--;
}
while (nlow<nhigh)
{
//从前向后找比标准值大的
if(arr[nlow]>temp)
{
//放到后面的坑里
arr[nhigh] = arr[nlow];
nhigh--; //后面的坑向前移动
break;
}
nlow++;
}
//循环出来 nlow nhigh相遇 标准值放入
arr[nlow] =temp;
return nlow;
}
//小区间扩张 也就是以最后一个元素 选取为标准值
int _Find1(int arr[],int nlow,int nhigh)
{
int nsmall = nlow-1; //最开始的时候没有小区间
for(nlow;nlow<nhigh;nlow++)
{
if(arr[nlow]<arr[nhigh]) //小区间扩张
{
if(++nsmall!=nlow) //++nsmall区间扩张 和nlow不相等
{
arr[nsmall] = arr[nsmall]^arr[nlow];
arr[nlow] = arr[nsmall]^arr[nlow];
arr[nsmall] = arr[nsmall]^arr[nlow];
}
}
}
//将标准值放入 因为比标准值小的 组成了小区间 所以放入的时候 要放入到小区间的下一个位置
if(++nsmall!=nhigh) //因为异或的时候 不允许位于相同的空间 所以需要判断
{
arr[nsmall]=arr[nsmall]^arr[nhigh];
arr[nhigh]=arr[nsmall]^arr[nhigh];
arr[nsmall]=arr[nsmall]^arr[nhigh];
}
return nsmall;
}
void QuickSort(int arr[],int nlow,int nhigh)
{
if(arr == NULL || nlow>nhigh) return;
//找标准值
int standard;
standard = _Find1(arr,nlow,nhigh);
//左半部分如此
QuickSort(arr,nlow,standard-1);
//右半部分如此
QuickSort(arr,standard+1,nhigh);
}
int main()
{
int arr[] = {200,100,0,5,4,6,9,1};
QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}