求N个数的数组中第K大的数的值

方法一:将这N个数的数组,通过简单的冒泡排序法,以递减的顺序将数组排序,然后返回第K个元素。

 

方法二:先把前K个元素拷贝到数组b,以递减的顺序对其排序,然后,将剩下的元素逐个与数组b比较,

如果小于数组b中的第K个元素则忽略,否则将新元素放到数组b中正确的位置上,同时将数组b中的一个

元素挤出数组。当算法终止时,返回数组b中第K个元素。

代码实现:

 1 #define K 4
 2 #define N 15
 3 
 4 ...
 5 
 6     //输入N个数
 7     printf("N numbers:\n");
 8     int a[N];
 9     for (int i = 0; i < N; i++)
10     {
11         scanf("%d", a + i);
12     }
13 
14     //取前k个元素
15     int b[K];
16     for (int i = 0; i < K; i++)
17     {
18         b[i] = a[i];
19     }
20 
21     //前k个元素降序排序
22     for (int i = K; i > 0; i--)
23     {
24         for (int j = 0; j < i - 1; j++)
25         {
26             if (b[j] < b[j+1])
27             {
28                 int temp = b[j];
29                 b[j] = b[j + 1];
30                 b[j + 1] = temp;
31             }
32         }
33     }

 

将a剩下的元素逐个插入数组b正确的位置上:

方法1:

 1     //将a剩下的元素与b中第K个元素比较,如果大于b中第K个元素,就将b中第K个元素赋值为a的元素,然后重新以降序排序数组b
 2     for (int i = K; i < N; i++)
 3     {
 4         if (a[i] > b[K - 1])
 5         {
 6             b[K - 1] = a[i];
 7 
 8             for (int j = K - 1; j > 0; --j)
 9             {
10                 if (b[j] > b[j - 1])
11                 {
12                     int temp = b[j];
13                     b[j] = b[j - 1];
14                     b[j - 1] = temp;
15                 }
16             }
17         }
18     }

 

方法2:

 1 //将a剩下的元素与b中的从第1个到第K个元素逐个比较,遇到大于b中的元素时,将b中该元素之后的所有元素都赋值为其本身前一位的元素的值,然后该元素赋值为a的元素。
 2     for (int i = K; i < N; i++)
 3     {
 4         for (int j = 0; j < K; j++)
 5         {
 6             if ( b[j] < a[i])
 7             {
 8                 for (int m = K - 1; m > j; m--)
 9                 {
10                     b[m] = b[m - 1];
11                 }
12 
13                 b[j] = a[i];
14                 
15                 break;
16             }
17         }
18     }

 

输出数组a中第K大的数:

1     //输出b中第K个元素
2     printf("%d\n", b[K - 1]);

 

posted @ 2016-10-12 14:41  凯撒大猩猩  阅读(3182)  评论(0编辑  收藏  举报