5.查找最小的 k个元素

来源:互联网 发布:九维外呼软件 编辑:程序博客网 时间:2024/06/04 18:12
/*5.查找最小的 k个元素题目:输入n整数,输出其中最小的k个。例如输入 1,2,3,4,5,6,7 和8这8个数字,则最小的4个数字为1,2,3  和 4。大部分人都是用具有k个元素的大根堆来实现,这里看到个更简单的题中没有要求我们按大小顺序输出其中的最小的k个数!仅仅要求输入这个k个数而已。这就提示我们不必对所有数据进行排序,只需找出这k个最小数而已。只需申请k个大小的数组存储最后的结果,如果数组未填满,就直接将输入的元素放入到数组中;如果数组中放满了k个元素,那么我们就需要找到当前数组中最大的元素值与刚输入的整数值比较,如果刚输入的整数值较小,则进行替换,否则继续输入……查找k个元素数组的最大值时间复杂度为O(k),需要进行n-k次,所以时间复杂度是O(k(n-k)),最后的平均复杂度应该是O(kn)。*/ #include<iostream>#include<stdio.h>using namespace std;#define MAX 100int main(){int max,pos,i,j,n,k,input,data[MAX];while(scanf("%d",&n)&&n)//n个数 {printf("请输入要输出的最小数的个数:");scanf("%d",&k); for(i=1;i<=n;i++){scanf("%d",&input);if(i<=k)data[i]=input;else{max=-9999999;pos=-1;for(j=1;j<=k;j++)if(data[j]>max){max=data[j];pos=j;}if(input<data[pos])data[pos]=input;}}for(i=1;i<=k;i++)printf("%d ",data[i]);printf("\n");}return 0;} /*测试数据 841 2 3 4 5 6 7 8751 4 5 9 2 3 7 9412 14 9 0 1 15 4 90 6421 3 0 0*/





方法2:

partition,然后处理第k个


方法3:

就是大根堆 ,小根堆做,适合海量数据


方法2:

partition


方法3:

就是大根堆 ,小根堆做,适合海量数据

0 0
原创粉丝点击