1. 程式人生 > >《JAVA》淺談——快速排序

《JAVA》淺談——快速排序

 

 

快速排序:又稱劃分交換排序(partition-exchange sort),一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序n個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n)演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。

演算法規則: 本質來說,快速排序的過程就是不斷地將無序元素集遞迴分割,一直到所有的分割槽只包含一個元素為止。
由於快速排序是一種分治演算法,我們可以用分治思想將快排分為三個步驟:

 

  • 分:設定一個分割值,並根據它將資料分為兩部分
  • 治:分別在兩部分用遞迴的方式,繼續使用快速排序法
  • 合:對分割的部分排序直到完成

 

程式碼實現(Java版本)

 public int dividerAndChange(int[] args, int start, int end) 
        {   
            //標準值
        	int pivot = args[start];
    		while (start < end) {
    			// 從右向左尋找,一直找到比參照值還小的數值,進行替換
    			// 這裡要注意,迴圈條件必須是 當後面的數 小於 參照值的時候
    			// 我們才跳出這一層迴圈
    			while (start < end && args[end] >= pivot)
    				end--;
    
    			if (start < end) {
    				swap(args, start, end);
    				start++;
    			}
    
    			// 從左向右尋找,一直找到比參照值還大的陣列,進行替換
    			while (start < end && args[start] < pivot)
    				start++;
    
    			if (start < end) {
    				swap(args, end, start);
    				end--;
    			}
    		}
    
    		args[start] = pivot;
    		return start;
    	}

    	public void sort(int[] args, int start, int end) 
        {
    		//當分治的元素大於1個的時候,才有意義
    		if ( end - start > 1) {
                int mid = 0;
    			mid = dividerAndChange(args, start, end);
    			// 對左部分排序
    			sort(args, start, mid);
    			// 對右部分排序
    			sort(args, mid + 1, end);
    		}
    	}

    	private void swap(int[] args, int fromIndex, int toIndex) 
        {
    		args[fromIndex] = args[toIndex];
    	}