• 求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:
    ");
     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
    ", b[K - 1]);
  • 相关阅读:
    isteven-multi-select
    javascript学习之js对象和json对象(obj=JSON.parse(stu))
    jquery学习之路之元素类的切换toggle
    jquery学习之路之测验错题集
    jquery学习之路之核心函数
    jquery学习之路之选择过滤
    较完整的angularjs+bootstrap应用程序接口controller
    angularjs+requeirjs模块化的应用程序接口
    SIP协议参数详情
    SIP初步认识
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/5952773.html
Copyright © 2020-2023  润新知