第三章:查找与排序(下)----------- 3.9 最快效率求出乱序数组中第k小的数

本文介绍了如何以尽可能高的效率在乱序数组中找出第k小的元素,提供了相应的代码实现。时间复杂度分析显示,在平均情况下为O(n),最坏情况下为O(n²)。
摘要由CSDN通过智能技术生成

最快效率求出乱序数组中第k小的数:

第k个元素:以尽量高的效率,求出一个乱序数组中按数值顺序的第k个元素值。

//伪代码:

selectK(A,p,r,k){
	q=partition(A,p,r); //主元下标 
	qK=q-p+1; //主元是第几个元素(排好序后) 
	if(qK==k){
		return A[q];
	} 
	else if(qK>k){
		return selectK(A,p,q-1,k);
	}
	else{
		return selectK(A,q+1,r,k-qK);
	}
}

partition(A,p,r) 

代码:

#include<iostream>
using namespace std;

//三点中值法 
int partition(int A[],int p,int r){
	
	//优化: 在p、r、mid之间,选一个中间值作为主元
	int midIndex=p+((r-p)>>1); //中间下标
	int midValueIndex=-1; //中值的下标
	if(A[p]<=A[midIndex]&&A[p]>=A[r]){
		midValueIndex=p;
	} 
	else if(A[r]<=A[midIndex]&&A[r]>=A[p]){
		midValueIndex=r;
	} 
	 else{
	 	midValueIndex=midIndex;
	 }
	swap(A[p],A[midValueIndex]);
	int pivot=A[p];
	
	int le
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值