最小的K個數(歸併排序)

題目描述:

輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,

C++

#include<iostream>
#include<vector> 
using namespace std;

class Solution {
public:
	void merge(int input[] , int start , int mid ,int end){
		int temp[end - start + 10] , len = start;
		int i = start , j = mid + 1;
		for( ; i <= mid && j <= end;){
			if(input[i] > input[j]){
				temp[len++]=input[j];
				j++;
			}else{
				temp[len++]=input[i];
				i++;
			}
		}
		while(i<=mid){
			temp[len++]=input[i];
			i++;
		}
		while(j <= end){
			temp[len++]=input[j];
			j++;
		}
		for(int i = start;i <= end;i++){
			input[i]=temp[i];
		}
	}

	void mergeSort(int input[] , int start , int end){
		if(start >= end){
			return ;
		}
		int mid = start + (end - start) / 2;
		mergeSort(input , start , mid);
		mergeSort(input , mid + 1 , end);
		merge(input , start , mid , end); 		
	}	

    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
    	if(k > input.size()){
        	input.clear();
  			return input;
	    }
    	int arr[input.size()+10];
    	int len =0;
    	for(vector<int>::iterator it = input.begin() ;it != input.end();it++){
			arr[len] = *it;
			len++;
		}
        mergeSort(arr , 0 , len - 1);
        input.clear();
        for(int i = 0;i < k;i++){
        	input.push_back(arr[i]);
        }
  		return input;
    }
};

int main(){
	vector<int> v;
	int n , k;
	Solution s;
	while(cin >> n >> k){
		int temp;
		for(int i = 0;i < n;i++){
			cin >> temp;
			v.push_back(temp);
		}
		v = s.GetLeastNumbers_Solution(v , k);
		for(vector<int>::iterator it = v.begin() ;it != v.end();it++){
			cout << *it << " ";
		}
		cout << endl;
	}
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章