填坑法---快速搞定快速排序演算法
阿新 • • 發佈:2019-01-05
快速排序由於排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被採用,再加上快速排序思想—-分治法也確實實用,因此很多軟體公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個,還有大大小的程式方面的考試如軟考,考研中也常常出現快速排序的身影。今天我來分享一點自己的心得,快速排序,快速搞定,希望對大家有點幫助。
該方法的基本思想是:
1.先從數列中取出一個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有一個數。
以一個數組作為示例,取區間第一個數為基準數。
我先上個圖讓大家感受一下,畫了很長時間,但是畫的還是很差,將就下看看吧
對挖坑填數進行總結
1.i =left; j =right ; 將基準數挖出形成第一個坑a[i]。
2.j–由後向前找比它小的數,找到後挖出此數填前一個坑a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前一個坑a[j]中。
4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。
照著這個總結很容易實現挖坑填數的程式碼:
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {32,6,45,28 ,53,18,67,22,89};
quick_sort1(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public static void quick_sort1(int arr[],int left,int right){
if(left<right){
int i=left;
int j=right;
int temp = arr[left]; //將第一個數作為基準數存入temp中
while(i<j){
while(i<j && arr[j]>temp) //從右往左開始掃描,大於temp,j--
j--;
if(i<j){ //找到小於temp的,將它填入上一個坑中,i++
arr[i] = arr[j];
i++;
}
while(i<j && arr[i]<temp)//從右往左開始掃描,小於temp,i++
i++;
if(i<j){
arr[j] = arr[i]; ////找到大於temp的,將它填入上一個坑中,j--
j--;
}
}
arr[i] = temp; //最後將temp填入最後一個坑中
quick_sort1(arr,left,i-1); //遞迴,完成左邊的排序
quick_sort1(arr,i+1,right); //遞迴,完成右一半的排序
}
}
放上執行截圖:
快速排序還有很多改進版本,如隨機選擇基準數,區間內資料較少時直接用另的方法排序以減小遞迴深度。有興趣的童鞋可以再深入的研究下。
注:有的書上是以中間的數作為基準數的,要實現這個方便非常方便,直接將中間的數和第一個數進行交換就可以了。