標籤:style blog http color java os io for 資料
快速排序是排序演算法中最受青睞的演算法之一,相對於堆排序和歸併排序而言,即便具有相同的複雜度O(NlogN)。面對大資料而言,快排的效率也更高。一般而言,資料結構中的排序演算法都是採取的雙向指標法。在之前寫的一篇博文《排序演算法(初級版)之快排、歸併、堆排序》中已經有過總結。這裡就不再囉嗦了。
本篇博文主要講一下,快拍的單項掃描實現,可以實現對鏈表的快拍。同時,本演算法可以高效的解決《劍指offer》中的“尋找最小k個數”
以下內容主要摘自《演算法導論》:
本演算法將待排序數組array分成四部分:比pivot小的,比pivot大的,尚未掃描的,pivot:
演算法過程如下:
具體實現:
public void qSort(int[] a,int begin,int end){if(begin >= end) return;int mid = partition(a, begin, end);qSort(a, begin, mid - 1);qSort(a, mid + 1, end);}public int partition(int[] a,int p ,int r){int x = a[r];int i = p - 1;int j = p;for(j = p; j < r; j++){if(a[j] < x){i++;swap(a, i, j);}}swap(a, i + 1, j);return i + 1;}
如此看來單向掃描法具體的實現起來並不比雙向掃描複雜,同時適應性更廣;
下面再利用partition實現一下,O(n)複雜度找到“前k小/大的元素”
1 public int findKSmallEle(int[] a,int k){ 2 if(k >= a.length || k < 0) return -1; 3 qSelect(a, k, 0, a.length - 1); 4 return a[k]; 5 } 6 7 private void qSelect(int[] a,int k ,int q,int r){ 8 if(q < r){ 9 int index = partition(a, q, r);10 if(index > k){11 qSelect(a, k, q, index - 1);12 }else if(index < k){13 qSelect(a, k, index + 1, r);14 }else15 return;16 }17 }
快速排序之單項掃描法