在数组A中寻找第k小的元素-最坏情况为线性时间的算法

该算法详细描述了一种在最坏情况下时间复杂度为线性的方法来寻找数组中的第k小元素。通过将数组划分为长度为5的小数组,找到中位数作为主元pivot,确保每次划分都能将问题规模减半,从而在递归过程中保持线性时间复杂度。算法包括插入排序、递归寻找中位数以及基于中位数的划分过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I : 平均情况下的时间复杂度为:O(n) 期望值(expected); 最坏情况下的时间复杂度为:O(n的平方)即:每次对A划分为(0:n-1)

函数命名为:find_k_th(A, p, q, k)    //int  value = find_k_th(A, p, q, k): value为从A[p]到A[q]中第k小的值

可以从 random-quicksort 算法中(复杂度分析运用了随机变量指示器:indicator of random variable)将数组A进行划分,随机选取主元pivot,得到一个返回的值r(r为数组A中<=pivot 的索引,即:A[r] = pivot,小于pivot的个数为:num = r-p+1 ):

  1. num = k, 返回A[r], 即:A[r]为所要找的A中第k小的值;
  2. num < k, 递归地返回 find_k_th(A, r+1, q, k-num), 即:A的左边有num个小于第k小的值,则第k小的值 = 右边的第 k-num 小的值;
  3. num > k, 递归地返回 find_k_th(A, p, r-1, k), 即: num > k, 第k小的值在A的左边
II: worst-case下时间复杂度为:O(n)的算法:

因为第I种算法只有平均情况下T(n)才为线性,不能避免最坏的情况;为了使最坏情况下T(n)也为线性,需要每次选择的主元pivot应该确定地处于A的中间,而非随机选择。

方法:递归的划分输入数组A

步骤:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值