算法分析与设计实践 - 作业6 - 选第k小元素:特定分治策略

1 .问题

在有n个整数的数组S中, 选第k小的元素。

2.解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.设计

//核心算法 
int select(int a[],int left,int right,int k) 
{
	int n=right-left;//计算数组规模大小 
	//小于5时直接用二分归并排序
	if (n<5){
		merge_sort(a,left,right-1);
		return a[left+k-1];
	}
	int i;
	int t=n/5;//每五个一组,分为t组 
	int *m = new int[t];
	for (i=0;i<t;i++) {//求中位数数组 
		merge_sort(a,left+i*5,left+i*5+5-1);
		m[i] = a[left+i*5+2];
	}
	merge_sort(m,0,i-1);
	int mid=m[i/2];//求中位数数组中的中位数mid
	int *a1=new int[n];
	int *a2=new int[n];
	int *a3=new int[n];
	int s1=0,s2=0,s3=0;
	for(int i=left;i<right;i++)
	{
		if(a[i]<mid)//元素小于mid存入a1数组 
		{
			a1[s1++]=a[i];
		}
		else if(a[i]==mid)//元素等于mid存入a2数组
		{
			a2[s2++]=a[i];
		}
		else//其余元素存入入a3数组
			a3[s3++]=a[i];
	}
	if(s1>=k)//如果小于mid的个数大于或等于k
	{
		return select(a1,0,s1,k);
	}
	if (s1+s2>=k)//如果小于mid的个数加上等于mid的个数大于或等于k个
	{
		return mid;
	}
	else//其他情况 
		return select(a3,0,s3,k-s1-s2);
}

4.分析

算法复杂度
O(n)
在这里插入图片描述在这里插入图片描述

5.码源

源码地址: https://github.com/chaoxing0910/ex6

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值