挖坑法的思想:记第一个数为key,要调整key的位置,使得左边的都要比key的小,右边的数都比key的大。
记录下关键字key==begin,把28那个位置挖坑hole==begin
让end找到小于28(key)的数,把那个数放到hole坑中,然后让hole==end
再从左边begin找大于28(key)的数,把那个数放在hole中,然后让hole==begin
结束条件begin>=end调出循环。然后arr[hole]=key;
完成一趟的调整。
//一趟挖坑
int arr[]={5,3,2,6,7,4,9};
int n=sizeof(arr)/sizeof(arr[0]);
int begin=0;
int end=n-1;
while(begin<end)
{
while(begin<end&&arr[end]>=key)
{
end--;
}
arr[hole]==arr[end];
hole==end;
while(begin<end&&arr[begin]<=key)
{
begin++;
}
arr[hole]==arr[begin];
hole=begin;
}
arr[hole]==key;
再分治思想,分成左边和右边。
用到分治递归,就要改变函数的参数,要有left和right
void QuickSort(int *arr,int left,int right)
{
if(left>=right)//递归的判段条件
{
return;
}
int begin=left,end=right;
int key=arr[begin];
int hole=begin;
while(begin<end)
{
while(begin<end&&arr[end]>=key)
{
end--;
}
arr[hole]=arr[end];
hole=end;
while(begin<end&&arr[begin]<=key)
{
begin++;
}
arr[hole]=arr[begin];
hole=begin;
}
arr[hole]=key;
QuickSort(arr,left,hole-1);//分治左边
QuickSort(arr,hole+1,right);//分治右边
}
void PRINT(int *a,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int arr[]={5,6,3,4,8,6,9,1,5,3};
int n=sizeof(arr)/sizeof(arr[0]);
QuickSort(arr,0,n-1);
PRINT(arr,n);
return 0;
}