1. 程式人生 > >填坑法---快速搞定快速排序演算法

填坑法---快速搞定快速排序演算法

快速排序由於排序效率在同為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); //遞迴,完成右一半的排序 } }

放上執行截圖:
這裡寫圖片描述

快速排序還有很多改進版本,如隨機選擇基準數,區間內資料較少時直接用另的方法排序以減小遞迴深度。有興趣的童鞋可以再深入的研究下。

注:有的書上是以中間的數作為基準數的,要實現這個方便非常方便,直接將中間的數和第一個數進行交換就可以了。