//问题描述: 试编写一个算法,使之能够在数组L[1...n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素) #include <stdio.h> // 结合快排思想,查找第5小函数
int find_the_minist_k(int sz[], int k, int low, int high)
{
int lowtemp = low, hightemp = high; // 由于下面修改low, high并且下面递归会用到low, high
int pivot = sz[low];
while (low < high)
{
while (low < high && sz[high] >= pivot)
high--;
sz[low] = sz[high];
while (low < high && sz[low] <= pivot)
low++;
sz[high] = sz[low];
}
sz[low] = pivot;
// 上面即为快排的划分算法
if (low == k) // 由于与k相同,直接返回pivot元素
return sz[low];
else if (low > k) //枢轴值大于k,在前一部分表中递归查找
return find_the_minist_k(sz, k, lowtemp, low - );
else // 枢轴值小于k,在后一部分中递归查找,注意,查找的k应为k减去前一部分表长度
return find_the_minist_k(sz, k - low, low + , hightemp);
}
int main()
{
int a[] = {, , , , , , -, };
// 查找数组a中第3小的元素,数组长度为8
int the_k_number = find_the_minist_k(a, , , );
printf("%d\n", the_k_number);
return ;
}