Top-k
随机数组中最大K个数:
3, 2 ,1, 6, 4, 5
最大的3个为:6,4,5
1、选择排序法。每次将待查询数组的最大一个找出,放入已查询数组中,一直找到K个为止。时间复杂度O(N*K)
2、堆排序法。使用小顶堆,存放最大K个元素。查询数组元素,如果堆中未满K个元素,则添加到堆中。如果堆里的元素满K个,且需查询的元素比堆的最小元素还大,则将最小的元素替换,更新小顶堆。如果堆里的元素满K个,但需查询的元素不比堆的最小元素大,则无需其他操作。时间复杂度O(N*log(K))
void shift(int b[], int i, int n) { int k,tmp; k=i; if (((2*i+1) <n) && b[k]>b[2*i+1]) { k=2*i+1; } if (2*i+2<n && b[k]>b[2*i+2]) { k=2*i+2; } if (k!=i) { tmp = b[k]; b[k] = b[i]; b[i] = tmp; shift(b, k, n); } } int func14(int a[], int k, int n) { int *b,j,tmp; b=(int* )malloc(sizeof(int)*k); memset(b, 0, sizeof(int)*k); j=0; for (int i=0; i<n; i++) { if (j<k) { b[j] = a[i]; int l=j; while(l>0) //自底向上 { if (b[(l-1)/2] > b[l]) { tmp = b[(l-1)/2]; b[(l-1)/2] = b[l]; b[l]=tmp; } l = (l-1)/2; } j++; } else //j==k { if (b[0]<a[i]) { b[0]=a[i]; shift(b, 0, j); //自顶向下 } } } printa(b, j); cout<<endl; return j; } //调用 int a[]= {3, 2 ,1, 6, 4, 5}; cout <<func14(a, 3, sizeof(a)/sizeof(int))<<endl;;
3、其他方法。编程之美中有。。。。