码迷,mamicode.com
首页 > 其他好文 > 详细

最小的K个数

时间:2014-07-21 14:34:25      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   

从有N个数的数组中需找最小的K个数。

方法一:O(nlog(n))

排序后的前K个数。

方法二:O(n)

1. 需要2k个额外的临时变量。

 1 #include <iostream>
 2 #include <limits>
 3 
 4 using namespace std;
 5 
 6 const int len = 1000;
 7 int n = 0, k = 0;
 8 
 9 int arr[len];
10 int minA[len], pos[len];                    // 保存前k个最小值和最小值的下标
11 
12 void moveMinA(int k);                        // 插入一个最小值,将之前的最小值向后赋值 
13 void selectNK(int arr[], int n, int k);
14 
15 int main()
16 {
17     cout << "please input n, k, array:\n";
18     cin >> n >> k;
19     for (int i = 0; i < n; ++ i)
20         cin >> arr[i];
21 
22     for (int i = 0; i < len; ++ i) 
23         minA[i] = numeric_limits<int>::max();
24 
25     selectNK(arr, n, k);
26 
27     return 0;
28 }
29 
30 void selectNK(int arr[], int n, int k)
31 {
32     for (int i = 0; i < n; ++ i) {
33         for (int j = 0; j < k; ++ j) {
34             if (arr[i] < minA[j]) {
35                 moveMinA(j);
36                 pos[j] = i; minA[j] = arr[i];
37                 break;
38             }
39         }
40     }
41     for (int i = 0; i < k; ++ i) {
42         cout << "min" << i << " = " << minA[i] << \t;
43     }
44 }
45 
46 void moveMinA(int j)
47 {
48     if (j != k - 1) {
49         for (int i = k - 1; i > j; -- i) {
50             pos[i] = pos[i - 1];
51             minA[i] = minA[i - 1];
52         }
53     }
54 }

// 未完待续

最小的K个数,布布扣,bubuko.com

最小的K个数

标签:style   blog   color   os   io   for   

原文地址:http://www.cnblogs.com/xiejianer9/p/3858115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!