快速排序的时间复杂度为O(nlogn),在排序算法中效率较高,所以经常被采用。快排的思想为分治法,软件公司笔试面试中经常会考到该算法。
算法的基本思想:
1.先从数列中抽出一个数作为基准数
2.分区过程,将比这个数大的数全部放在右边,将比这个数小的全放在左边
3.对第二步分区得到的两个区在进行分区,直到每一个区中只有一个数
算法过程举例:
原始数列: 27 99 11 37 92 78 21 35 57 62
1.抽出一个数作为基数:27(low=0,high=9)
2.分区,从右往左找,找到比27小的数(62比27大,high--,57比27大,high—….)
21 99 11 37 92 78 27 35 57 62(low=0,high=6)
再从左往右找比27大的数字,21 27 11 37 92 78 99 35 57 62(low=1,high=6)
再从high=6的基础上往左找,找到11比27小 21 11 27 37 92 78 99 35 57 62(low=1,high=1)
此时low<high的条件不满足,结束分区。
3.对每一个分区重复第二步
代码:
int Partion(int a[],int low,int high) { int key; key = a[low]; while(low<high){ while((low<high)&&a[high]>=key) high--; a[low]=a[high]; while((low<high)&&a[low]<=key) low++; a[high]=a[low]; } a[low] = key; return low; } void qsort(int a[],int low,int high){ int loc=0; if(low<high){ loc= Partion(a,low,high); qsort(a,low,loc-1); qsort(a,loc+1,high); } }