查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,
则最小的4个数字为1,2,3和4。
冒泡改进:http://hi.baidu.com/leifenglian/item/9cb4ad25be1333d30f37f966 这里时间复杂度O(n*k)
不用排序算法:http://xingyunbaijunwei.blog.163.com/blog/static/7653806720122293850244/ 时间复杂度也是O(n*K)
虽然冒泡排序在以往中时间复杂度都是一般的O(n^2) 但是这里似乎有了点优势,它的空间复杂度o(1)而对于第二种则是o(k)
我最不善长分析这个复杂度了,上面有错的还请大家指出!
这里我就用选择排序写一个版本
//============================================================================
// Name : FindLeastNums_2.cpp
// Author : YLF
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
#define MAX 50
void getMinK(int* arr, int num, int k);
int main() {
int arr[MAX];
int input = 0;
int num = -1;
while(true){
num++;
cin>>input;
if(input!=-1)
arr[num] = input;
else
break;
}
cout<<"intput K=";
cin>>input;
if(num>0)
getMinK(arr, num, input);
return 0;
}
void getMinK(int* arr, int num, int k){
int minIndex = 0, i = 0, j=0;
for(i=num-1; i>=num-k; i--){
minIndex = 0;
for(j=0; j<i; j++){
if(arr[j+1] < arr[minIndex])
minIndex = j+1;
}
//swap
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
cout<<temp<<" ";
}
}