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.心得体会

  题目限制了算法的时间复杂度,因此不能仅仅使用快速排序,利用分治法能够节约算法的运算时间,提高效率。

  注意下标,防止越界。

posted on 2020-10-03 15:23  STMUM  阅读(118)  评论(0)    收藏  举报