最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
未完, 待续, 好像设计堆排序
先排序在遍历, 此处使用插曲排序
class Solution {
public:void insertSort(vector<int> &vt) {int inner = 0;int outer = 0;for (outer = 1; outer < vt.size(); outer++) {int temp = vt[outer];inner = outer;while ((inner > 0) && (vt[inner-1] > temp)) {vt[inner] = vt[inner - 1];inner--;}vt[inner] = temp;}}vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {vector<int> ret;if ((0 > input.size()) || (0 >= k) || (k > input.size())) {return ret;}insertSort(input);for (int i = 0; i < k; i++) {ret.push_back(input[i]);}return ret;}
};
堆排序, 没看懂, 但感觉挺厉害的样子
class Solution {
public:vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {vector<int> result;if(input.size()==0||k==0||k>input.size()){return result;}for(int i=input.size()/2-1;i>=0;i--){//初始化堆adjustHeap(input,i,k);}int i=k;while(i<input.size()){if(input[0]>input[i]){int temp=input[i];input[i]=input[0];input[0]=temp;adjustHeap(input,0,k);i=k;}else {i++;}}for(int i=0;i<k;i++){result.push_back(input[i]);}return result;}void adjustHeap(vector<int>&input,int i,int length){//堆调整int child=i*2+1;if(child<length){if(child+1<length&&input[child+1]>input[child]){child=child+1;}if(input[child]>input[i]){int temp=input[i];input[i]=input[child];input[child]=temp;adjustHeap(input,child,length);}}}void heapSort(vector<int>&input,int length){//堆排序for(int i=length/2-1;i>=0;i--){//初始化堆adjustHeap(input,i,length);}for(int i=length-1;i>0;i--){int temp=input[i];input[i]=input[0];input[0]=temp;adjustHeap(input,0,i);}}};