topK【快速排序】

现在是大数据场景,不少时候,面试后端开发实习的时候常常会给出一道topK问题,这道题有一个解法是基于快速排序的原理,快速排序是将排序的序列通过一次划分的操做,将小于基数的数字排到基数左边,再将大于基数的数字排到基数右边,再对两边分别排序,既然只求最大K个,那么咱们能够采用一种剪枝的思想,对须要不须要的递归的部分进行一个裁剪,这样就能够减小一些没必要要的操做,这是咱们用快速top排序来解决topK的解法,如下是笔者的一个解法,有问题能够提出来。ios

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int mp[100000] = {0};
int len, n;
void quick_sort(int arr[], int l, int r) { //从小到大排序
	if(l < r) {
		int temp = arr[l];
		int low = l;
		int height = r;
		while(low < height) {
			while(mp[temp] <= mp[arr[height]] && low < height) {
				height--;
			}
			arr[low] = arr[height];
			while(mp[temp] >= mp[arr[low]] && low < height) {
				low++;
			}
			arr[height] = arr[low];
		}
		arr[low] = temp;
		if(low > len-n)//判断左边是否须要排序
		quick_sort(arr, l, low-1);
		
		quick_sort(arr, low+1, r);
	}
}
int main() {
	//int a;
	//cin >> a;
	int visit_log[6] = {10001,1002,10001, 20032, 302, 302};
	n = 2;
	for(int i = 0; i < 6; i++) {
		mp[visit_log[i]]++;
	}
	int arr[6], cnt = 0;
	for(int i = 0; i < 100000; i++) {
		if(mp[i] != 0)
			arr[cnt++] = i;
	}
	len = cnt;

	//cout<<len<<endl;
	quick_sort(arr, 0, len-1);
	for(int i = len-1, j = 0; j < n; j++, i-- ) {
		cout<<arr[i]<<endl;
	}
	//cout << "Hello World!" << endl;
}