题目:找第k小的数
设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数。
输入格式:
输入有两行:
第一行是n和k,0<k<=n<=10000
第二行是n个整数
输出格式:
输出第k小的数
算法描述:
共有四个函数:Main、Find、Partition以及Swap(具体代码见随笔最后)
Main:略
Find:通过调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左段或右段查找。
Partition:将数组中比x小的元素放在x左半部分,比x大的放在右半部分,此为该题的核心算法。
Swap:交换数组中两位置的值。
算法分析:
此题借用快速排序算法,对其进行改进,无需将数组完全排序好,只需粗略筛选找到第k小的数即可。
空间复杂度:仅在原数组上进行操作,O(1)。
时间复杂度:partition算法为O(n),总共为O(n)。
心得体会:
分治法与递归经常一起使用,要熟练地掌握。分解问题的能力也非常重要,只有分解好问题,才能更好地使用分治法。