9.1最小(大)值问题
下界需要n-1次比较 (线性时间)
9.2 选择算法
一般选择问题看起来比找最小值这样的简单问题要难,
返回数组[p..r]中第i 小的元素
第一种方法:使用快速排序为模型。区别:快速排序会递归处理划分的两边,平均为0(n*logn), 这里这处理划分的一遍,平均为0(n),最差O(n2)
int partition(int * a, int low, int high)
{
int pivotkey;
pivotkey = a[low];
while (low < high)
{
while (low < high&&pivotkey <= a[high])
high--;
a[low] = a[high];
while (low < high&&pivotkey >= a[low])
low++;
a[high] = a[low];
}
a[low] = pivotkey;
return low;
}
int sort(int * a, int low, int high, int num)
{
int p, k;
if (low == high)
return a[low];
else if (low < high)
{
p = partition( a, low, high);
k = p - low + 1;
if (k == num)
return a[p];
else if (k > num)
return sort(a, low, p - 1, num);
else
return sort(a, p + 1, high, num - k);
}
}
int main()
{
int a[10] = { 1,2,3,4,9,8,5,6,7,0 };
int num=sort(a, 0, 9, 7);
cout << num << endl;
system("pause");
}
第二种方法:看起来有些复杂,有时间再研究