(9-4) 快速排序
阿新 • • 發佈:2018-11-03
快速排序是目前應用最廣泛的排序演算法。但快速排序是一種不穩定的排序演算法。
快速排序演算法是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+" "); } } //快速排序演算法 publicstatic 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很小時,這種排序方法往往比其他簡單排序方法還要慢。