看了这片文章,确实非常形象,http://blog.csdn.net/morewindows/article/details/6684558
QuickSort:找一个标准值(枢轴),将比标准值小的放到左侧,比标准值大的放在它右侧,根据标准值位置将当前数据分割成两部分,两部分分别重复以上以上操作
#include<stdio.h>
int Sort(int arr[],int nLow,int nHigh)
{
int temp;
temp = arr[nLow];
while(nLow < nHigh)
{
//从后向前找比标准值小的
while(nHigh > nLow)
{
//找到了
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++;
}
}
//标准值放入
arr[nLow] = temp;
return nLow;
}
int Sort2(int arr[],int nLow,int nHigh)
{
int nSmall = nLow-1;
for(nLow;nLow < nHigh;nLow++)
{
//找小的
if(arr[nLow] < arr[nHigh])
{
//小区间扩张
if(++nSmall != nLow)
{
arr[nLow] = arr[nLow]^arr[nSmall];
arr[nSmall] = arr[nLow]^arr[nSmall];
arr[nLow] = arr[nLow]^arr[nSmall];
}
}
}
//标准值放入
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;
//1.标准值
int nStandard;
nStandard = Sort2(arr,nLow,nHigh);
//2.分割
QuickSort(arr,nLow,nStandard-1);
QuickSort(arr,nStandard+1,nHigh);
}
void Print(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
int i;
for(i = 0;i<nLength;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {10,2,8,9,1,64,3,8,91};
QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
Print(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}