现在是大数据场景,不少时候,面试后端开发实习的时候常常会给出一道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; }