题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
如果这些数字,是放在数组中给出的话,直接建立小顶堆,然后输出前k个就好了。 时间复杂度 kLog(n),建立堆log(n),共建k次
void heapAdjust(int* a,int s, int m) { int temp = a[s]; for(int j=2*s+1; j<=m; j=j*2+1) { if(j<m && a[j] > a[j+1]) j++; if(temp<=a[j]) break; a[s] = a[j]; s = j; } a[s] = temp; } int main() { int a[] = {49,38,65,97,76,13,27,49}; int length = sizeof(a)/sizeof(a[0]); for(int i= (length-1)/2 ; i>=0; i--) heapAdjust(a,i,length-1); int k=3; for(int i = length-1,j=0; i>0&&j<k; i--,j++) { int temp = a[0]; a[0] = a[i]; a[i] = temp; heapAdjust(a,0,i-1); cout<<temp<<endl; } }