期望為線性的選擇演算法
阿新 • • 發佈:2018-12-06
基本思想
以快排為模型,對陣列遞迴劃分,但遞迴後只處理包含所查第k個元素的那邊,如此遞迴下去直至查詢成功
圖解
無
程式碼
虛擬碼
這裡的partition就是其中的randomized_partition
C程式碼
#include <stdio.h> int Randomized_partition(int * a, int p, int r) { int x = a[r]; int i, j; i = p - 1; int temp; for(j = p; j < r; j++) { if(a[j] <= x) { i+=1; temp = a[i]; a[i] = a[j]; a[j] = temp; } } temp = a[i+1]; a[i+1] = a[r]; a[r] = temp; return i+1; } int Randomized_select(int * a, int p, int r, int i) { if(p == r) return a[p]; int q = Randomized_partition(a,p,r);//以當前陣列最後一個元素來分割陣列 int k = q-p+1;//當前陣列k前都小於a[k],k後都大於a[k] if(i == k) return a[q]; else if(i < k) return Randomized_select(a,p,q-1,i); else return Randomized_select(a,q+1,r,i-k);//i-k,子陣列中相對偏移量 } int main() { int a[] = {1, 3, 8, 6, 5, 4, 9, 7, 2, 10};//[1,10] int len = sizeof(a)/sizeof(int); int ans = Randomized_select(a,0,9,3); printf("%d\n", ans); return 0; }
時間複雜度
期望執行時間是o(n),書中推到複雜我就直接跳過了;另外它的最壞執行時間為o(n^2),因為不是每次劃分都是均勻的,所以存在每次劃分都最不均勻的情況,即最壞執行時間.