作业6 第K小元素:特定分治策略

本文探讨如何运用特定的分治策略解决找到数组中第K小元素的问题,涉及快速排序的相关思想,并提供了问题解析、算法设计、复杂度分析及源代码展示。
摘要由CSDN通过智能技术生成

1.问题
求第K小元素。
2.解析
在这里插入图片描述
3.设计
在这里插入图片描述
4.分析
在这里插入图片描述
在这里插入图片描述
5.源代码

int Partition( int a[], int start, int end, int pivot ){
	int target = a[pivot];
	int low = start, high = end;
	a[pivot] = a[low];
	while ( high > low ){
		for ( ; a[high] <= target && high > low; ) {
				high--;
		}
		a[low] = a[high];
		for ( ; a[low] >= target && high > low;  ) {
				low++;
		}
  		a[high] = a[low];
 	}
	a[low] = target;
	return low;
}
int Select( int a[], int left, int right, int k ){//求第n-K+1大的数 
	if (  right - left < 0 || left < 0 || k < 0 || a == NULL ){
		return -1; 
	}
	if ( left == right || k == 0 ){
		return left;
	}
	int min, i, kth;
	if ( right - left  < k ) {//k比数组下标小1, 当数组覆盖范围<k时候,直接返回里面最小的一个数字
		min = a[ kth=left ];
		i = left+1;
		for ( ; i <= right; i++ ){
			if( a[i] < min ){ //输出最小的一个,它是第kth大的数
			min = a[ kth=i ];
			}
		}
	}
	else{
		i = Partition( a, left, right, left+k-1 );   //快排 
		if ( k-1 < i-left ) {//k比数组下标小1
			kth = Select( a, left, i-1, k );
		}
		else if ( k-1 == i-left ){
			kth = i;
		}
		else { //k+1 > i-left
			kth = Select( a, i+1, right, k-(i-left+1)  );
		}
	}
 return kth;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值