《实用算法的分析与程序设计》Chapt 2 顺序统计算法与中位数
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座标的中位数;