1.实践题目名称
找第k小的数
2.问题描述
输入两个整数n和k,再输入n个整数,从n个整数中找到第k小的数并输出
3.算法描述
该算法包含三个函数:int partition(int a[], int left, int right) void find(int a[],int left,int right,int k) int main()
3.1 int partition(int a[], int left, int right)

partition函数的功能是将输入的n个整数中比基准值x小的数都排在原数组的左半部分,比基准值x大的数都排在原数组的右半部分。
3.2 void find(int a[],int left,int right,int k)

find函数的作用是通过调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左段或右段查找。
3.3 int main()

主函数里对变量进行定义以及对函数进行了输入输出和调用。
4.时间空间复杂度分析
该算法结合了快排和分治法。
最坏情况:在划分过程产生的两个区域分别包含n-1个元素和1个元素。
partition函数时间复杂度为O(n),如果每一步都出现这种不对称划分,时间复杂度为O(n^2)。
该算法使用递归,最坏情况下需递归n-1次,空间复杂度为O(n)。
最好情况:每次划分所取的基准都恰好为中值,每次划分都产生两个大小为n/2的区域,时间复杂度为O(nlogn)。
5.心得体会
题目限制了算法的时间复杂度,因此不能仅仅使用快速排序,利用分治法能够节约算法的运算时间,提高效率。
注意下标,防止越界。
浙公网安备 33010602011771号