文章目錄
n個元素集合中,第i個順序統計,即第i小的元素。
中位元,即第n/2小元素
2.1 順序統計的演算法(求第i小元素的演算法)
可以用分治法,參考快速排序的方法:
設第i小元素為s
divide:
A[0...N]
去中樞pivot = A[0]
以pivot為支點,將集合劃分為A[0...J], A[J+1...N],使得前一集合所有元素都小於pivot,後一集合所有元素都大於pivot
conquer:
if(s <= pivot), 在區間1遞迴尋找
if(s > pivot), 在區間2遞迴尋找
combine:
無
#include <iostream>int split(int arr[], int lo, int hi){ int pivot = arr[lo]; int pos = lo; for(int i=lo+1; i <= hi; ++i) { if(arr[i] < pivot && pos < i) { ++pos; std::swap(arr[pos], arr[i]); } } std::swap(arr[lo], arr[pos]); return pos;}int find_ith(int arr[], int lo, int hi, int k){ int mid; if(lo < hi) { mid = split(arr, lo, hi); if(k <= mid) { find_ith(arr, lo, mid, k); } else if(k > mid) { find_ith(arr, mid+1, hi, k); } } return arr[k];}int main(){ int arr[10] ={10, 20, 34, 4, 14, 8, 7, 73, 54, 5}; for(int i = 0; i< 10; ++i) { std::cout << "the " << i+1 << "th small element is: " << find_ith(arr, 0, 9, i) << "\n"; } system("PAUSE"); return 0;}
演算法複雜度分析:O(NlogN)
找第i小元素有線性時間複雜度的演算法,詳細請見《演算法設計技巧與分析》P110
2.2 中位元的應用
[證明]
[例子]石油管的最優位置
Olay教授正在為一家石油公司諮詢,公司正在計劃建造一條由東向西的管道.滾管道要穿過一個有n口井的油田。從每口井中都有一條噴油管沿最短路徑與主管道直接相連(或南或北)。
紿定各個井的x座標和Y座標.Olay教授如何才能選擇主管道的最優位置(即使得各噴管長度總和最小的位置?)
[分析]確定上管道最優位置置.實際上就是求n個油井Y座標的中位元;
帶權中位元應用: