/*
第k小的数:
输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个(例如k=1就是最小值)。n<=10^7
思路:
排序后再输入下标k-1的元素,nlogn = 10^7*300=3*10^9
书析:
利用快速排序分解[low,high]为[low,iPos-1]和[iPos+1,high]时,由于左边全部小于等于枢轴,
只需判断左边序列:iPos-1-low+1=iPos-low的个数=k-1,此时,枢轴必为第k大元素
输入:
8
1 9 6 3 4 7 9 0
3
8
1 9 6 3 4 7 9 0
5
8
1 9 6 3 4 7 9 0
8
8
1 9 6 3 4 7 9 0
1
输出:
3
6
9
0
*/
/*
关键:
1 利用快速排序分解[low,high]为[low,iPos-1]和[iPos+1,high]时,由于左边全部小于等于枢轴,
只需判断左边序列:iPos-1-low+1=iPos-low的个数=k-1,此时,枢轴必为第k大元素
2 if(iPos - low == k-1)//如果左边的元素个数刚好等于k-1,说明iPos中的iArr[iPos]即为第k个元素
else if(iPos - low < k-1)//如果左边的元素个数小于k-1,说明第k小的元素在右边的序列中,只在右边求解,同时应将已经左边的个数舍弃,更新k的值
{
k = k - (iPos - low) - 1;//由于枢轴也被舍弃,这里需要多减1个1
quickSort(iArr,iPos+1,high,k);
}
else//在左边,k不需要
算法竞赛入门经典:第八章 高效算法设计 8.4快速排序应用之第k小的数
最新推荐文章于 2023-10-17 16:11:38 发布
该博客介绍了如何使用快速排序算法在大规模数据中寻找第k小的数。通过调整快速排序的过程,当左半部分元素数量等于k-1时,枢轴位置的元素即为第k小的数。如果k大于左半部分的数量,则在右半部分继续搜索,同时更新k值。这种方法避免了完整排序,提高了效率。
摘要由CSDN通过智能技术生成