实验六
1.问题
在长度为N的乱序数组中寻找第K(N>=k)小的元素
2.解析
用分治的策略,首先选择一个基准数也称为枢纽元,通过一趟排序将数组分割成独立的两部分,枢纽元左边的数都不大于它,枢纽元右边的数都不小与它,记他的位置为mid。如果左半边的长度刚好为K,说明mid下标对应的元素就是第K小元素;如果左边的长度大于K,那么说明第K小的元素在左半边,往左半边寻找。如果左边的长度小于K,那么说明第K小的元素在右半边,往右半边寻找。
3.设计
select函数:
int select(int a[],int low, int high, int k)
{
if (low >= high) return a[low];
int i = low;
int j = high + 1;
int pivot = a[low];//枢纽元
while (true)
{
do {
i++;
} while (a[i] < pivot);
do {
j --;
} while (a[j] > pivot);
if (i >= j) break;
swap(&a[i], &a[j]);
}
if (j - low + 1 == k)
return pivot;
a[low] = a[j];
a[j] = pivot;
if (j - low + 1 < k)
return select(a,j + 1, high, k - j + low - 1);
else
return select(a,low, j - 1, k);
}
4.分析
O(n)=n
5.源码
连接:源代码