线性时间内从一个数组中找出第K个最小的元素——编程珠玑

这篇博客介绍了如何在数组中使用快速选择算法在线性时间内找到第K个最小元素。通过随机选取枢轴并进行划分,然后递归处理左右子区间,实现高效查找。示例代码分别展示了两种不同的实现方式。
摘要由CSDN通过智能技术生成
线性时间内从一个数组中找出第K个最小的元素——编程珠玑

题目:编写程序,在O(n)时间内从数组x[0...n-1]中找出第k个最小的元素,算法中可以对x中的元素进行排序。
思路:快速排序选择一个pivot对数组进行划分,左边小于pivot,右边大于等于pivot,所以我们计算左边小于pivot(加上pivot)的个数count总共有多少,如果等于k,正是我们所要的,如果大于k,说明第k小的数在左边,那就在左边进行我们的递归;否则,在右边,那么说明右边的第k-count小的数就是我们所要的,在右边进行我们的递归。
算法实现一:
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. inline void Swap(int a[],int i,int j)//内联函数,交换两个元素位置  
  5. {  
  6.     int temp=a[i];  
  7.     a[i]=a[j];  
  8.     a[j]=temp;  
  9. }  
  10.   
  11. int Partition(int a[],int p,int r)//根据pivot a[r]来划分数组  
  12. {  
  13.     int pivot=a[r];  
  14.     int low=p-1;  
  15.     int i;  
  16.     for(i=p;i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值