最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路一:堆排序,小根堆,每次找到取出最小的根
代码一:
1 void Heap(vector<int> &arr,int len,int Root) 2 { 3 int index; 4 while(1) 5 { 6 if(Root*2+2 < len )//有左,右孩子 7 { 8 //左右孩子中大的 9 // printf("999\n"); 10 index = arr[Root*1+1] < arr[Root*2+2] ? Root*1+1 : Root*2+2; 11 } 12 else if(Root*1+1 < len)//只有左孩子 13 { 14 index = Root*1+1; 15 } 16 else//没孩子 17 break; 18 if(arr[index] < arr[Root]) //与根交换 19 { 20 arr[index] = arr[index]^arr[Root]; 21 arr[Root] = arr[index]^arr[Root]; 22 arr[index] = arr[index]^arr[Root]; 23 Root = index; 24 } 25 else 26 break; 27 } 28 } 29 vector<int> GetLeastNumbers_Solution(vector<int> &input, int k) { 30 vector<int> vec; 31 int len = input.size(); 32 if(k > input.size()||k==0) return vec; 33 for(int i = len/2-1;i >=0 ;i--) 34 Heap(input,len,i); 35 36 for(int i = len-1;i>=0;i--) 37 { 38 vec.push_back(input[0]); 39 if(vec.size() == k) 40 break; 41 //交换 42 input[0] = input[0]^input[i]; 43 input[i] = input[0]^input[i]; 44 input[0] = input[0]^input[i]; 45 //调整根 46 Heap(input,i,0); 47 } 48 return vec; 49 }