1. 程式人生 > >(9-4) 快速排序

(9-4) 快速排序

  快速排序是目前應用最廣泛的排序演算法。但快速排序是一種不穩定的排序演算法。

  快速排序演算法是C.R.A. Hoare於1962年提出的一種劃分交換的方法,它採用分治法(divide and conquer)進行排序。其基本思想是任取待排序元素序列中的某個元素(例如取第一個元素)作為基準,按照該元素的排序碼大小,將整個元素序列劃分為左右兩個子序列:左側子序列中所有元素的排序碼都小於基準元素的排序碼,右側子序列中所有元素的排序碼都大於或等於基準元素的排序碼,基準元素則排在這兩個子序列中間(這也是該元素最終應安放的位置)。然後分別對這兩個子序列重複施行上述方法,直到所有的元素都排在相應位置上為止。

/**
 * Created by xiu on 2018/10/17.
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] data = {8,7,9,3,5,2,3,1};
        quickSort(data, 0, data.length-1);
        for(int e:data){
            System.out.print(e+" ");
        }
    }

    //快速排序演算法
    public
static void quickSort(int[] data, int left, int right){ //pivot = data[left]是基準元素,排序結束後它的位置在pivotPos,把排序序列分成兩部分 //排在它左邊的元素都小於它,排在它右邊的元素都大於等於它 if(left < right){ int pivotPos = partition(data, left, right); quickSort(data, left, pivotPos - 1); quickSort(data, pivotPos
+ 1,right); } } //一次劃分演算法 public static int partition(int[] data, int low, int high){ //pivotPos為(小於基準元素列表)的最後一個元素位置,pivotPos=low除外 //pivot為基準元素,取最左邊元素 int pivotPos = low, pivot = data[low]; for(int i = low + 1; i <= high; i++){ if(data[i] < pivot){ pivotPos++; //小於基準的交換到左側去 if(pivotPos != i){ int temp = data[pivotPos]; data[pivotPos] = data[i]; data[i] = temp; } } } //基準元素就位:將low位置元素(pivot)與pivotPos位置元素(小於基準元素列表的最後一個元素)交換位置 data[low] = data[pivotPos]; data[pivotPos] = pivot; return pivotPos; //返回基準元素位置 } }

劃分過程如下圖所示

 

  函式QuickSort的平均計算時間也是O(nlog2n)。我們每次都選用序列的第一個元素作為比較的基準元素。這樣的選擇簡單但不理想。在最壞的情況,即待排序元素序列已經按其排序碼從小到大排好序的情況下,其遞迴樹成為單支樹,如圖9.6所示。每次劃分只得到一個比上一次少一個元素的子序列。

  基本的快速排序演算法,對於n較大的平均情況而言,快速排序是“快速”的,但是當n很小時,這種排序方法往往比其他簡單排序方法還要慢。