快排的基本思路:
首先将数组的第一个数字作为标准值;然后我们只需要找到该数组在排好序后的数组中的位置,在此位置之前的数字都比该数字小,在此位置之后的数字都比还数字大。
下面介绍一下怎么找到标准值的位置:
1 先将标准值保存,腾出标准值的位置,出坑(注 坑不是实际意义上的空间,而是我们假象的,只需要保存标准时即可)
2 从后面向前找到比标准值小的数字,放在坑里,这样又腾出一个位置
3 再从前向后找到比标准值大的数字 放在坑里
循环找到标准值的位置,最后将数字分成两部分,标准值前的数字较小,标准值后的数字较大,然后将这两部分再进行排序操作(我们使用的是递归的方式)
这样讲的太抽象 下面我,我们看一下代码:
#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++;
}
}
//nMin>=nMax时,循环条件结束,标准值放入,并将位置返回
arr[nLow] = temp;//此时nLow和nHigh相同
return nLow;
}
void QuickSort(int arr[],int nLow,int nHigh)
{
//递归循环的结束条件
if(arr == NULL|| nLow >= nHigh)return;
//招标准值位置
int nStandard;
nStandard = Sort(arr,nLow,nHigh);
//根据标准值位置 将数组分成两部分 各部分分别执行以上操作
QuickSort(arr,nLow,nStandard-1);
QuickSort(arr,nStandard+1,nHigh);
}
int main()
{
int arr[] = {10,9,20,39,441,709,27,11,87};
QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
return 0;
}