分治1——输出前m个大的数

输出n个数中前m个大的数可以采用先排序在取前m个大的数,这个最好的时间复杂度为O(nlogn)。可以利用快排的思想加快时间复杂度,下面算法时间复杂度为O(n+mlogm),若m<<n时,则时间复杂度约为O(n)。
#include<iostream>

using namespace std;
int a[100];

void swap(int &a, int &b)
{
	int temp;
	temp = b;
	b = a;
	a = temp;
}
void QuickSort(int a[], int s, int e, int m)
{
	if (s >= e)
		return;
	int k = a[s];
	int i = s, j = e;
	while (i != j)
	{
		if (j > i && a[j] > k)
			j--;
		swap(a[i], a[j]);
		if (j > i && a[i] < k)
			i++;
		swap(a[i], a[j]);
	}

	int b = (e - j) + 1; // 判断右边大的数有几个
	if (m > b)           // 若小于m个,在左边再取m-b个
		QuickSort(a, s, i, m - b);
	if (m < b)           // 若大于m个,在右边再去m个
		QuickSort(a, j + 1, e, m);
}

int main()
{
	int m,n;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	QuickSort(a, 0, n - 1, m);
	for (int i = n-1; i >= n-m; i--)
		cout << a[i] << ' ';
	cout << endl;
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/qinxinli/article/details/79967051