本文主要是介绍排序算法之快速排序(挖坑法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
挖坑法的思想:记第一个数为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;
}
这篇关于排序算法之快速排序(挖坑法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!