求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]);

 

转载于:https://www.cnblogs.com/Jace-Lee/p/5952773.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值