0
点赞
收藏
分享

微信扫一扫

【算法设计】分治法求前k大的数

滚过红尘说红尘 2022-04-05 阅读 63
算法

实验题目:
分治法求前k大的数

实验提示:
利用快速排序划分的思想,但对其进行修改,使得每次划分,比轴值小的值在左边,比轴值大的值在右边,因此,划分后轴值所在位置i就表示它在序列中第i大。比较k和i可以得到下面几种情况:
(1)如果k>=i, 表示前i个数都属于前k大的数据中,因此输出所有前i个元素,然后在右侧序列中继续寻找前k大元素;
(2)如果k<i,表示前k大的数包含在前i大的数里,因此在左侧序列中继续寻找前k大的数。

实验代码

#include<iostream>
using namespace std;
void sort_q(int arr[], int l, int r, int k) {
	if (l >= r)
		return;
	int i, j, temp, a;
	i = l;
	j = r;
	temp = arr[i];
	while (i != j) {
		while (i < j && arr[j] >= temp) 
			j--;
			a = arr[j];
			arr[j] = arr[i];
			arr[i] = a;
		
		while (i < j && arr[i] < temp)
			i++;
			a = arr[j];
				arr[j] = arr[i];
				arr[i] = a;	
	}
	if (r - i + 1 == k)
		return;
	if (r - i + 1 >= k)
		sort_q(arr, i + 1, r, k);
	else
		 sort_q(arr, l, i - 1, k - (r - i + 1));
}
 
int main() {
	int arr[] = { 15,18,77,54,62,32,45,98,56,55,89,157,4,56,96,38,6,18,17,20 };
	int i,k, m;
	cout << "The squences are:" << endl;
	for (i = 0; i < 20; i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
	cout << "Input the first large number :" << endl;
	cin >> k;
	m = sizeof(arr) / sizeof(arr[0]);
	sort_q(arr, 0, m - 1, k);
	for (i = m - 1; i >= m - k; i--)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

运行截图:
运行截图
但是老师要求截图是这样:
要求截图:
问题出现在哪,不太清楚…

举报

相关推荐

0 条评论