• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
清瑜
博客园    首页    新随笔    联系   管理    订阅  订阅

算法第二章上机实践报告

题目:找第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)。

心得体会:

分治法与递归经常一起使用,要熟练地掌握。分解问题的能力也非常重要,只有分解好问题,才能更好地使用分治法。

 

posted on 2020-10-03 23:21  清瑜  阅读(124)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3