第1章引论

1.1 有一组N个数,求其第K大者。

方法1:bubble sort

#include <stdio.h>

int main(){
   int arr[] = {10, 9, 8, 7, 1, 6, 2, 3, 4, 5};
   int k; // 第K大
   int i, j, arrLong;
   printf("input the number> ");
   scanf("%d", &k);

   // bubble sort
   arrLong = sizeof arr / sizeof arr[0];
   for ( i = 1; i < arrLong; i++ ){
      for ( j = 0; j < arrLong - 1; j++ ){
         if ( arr[j+1] > arr[j] ){
            int temp = arr[j+1];
            arr[j+1] = arr[j];
            arr[j]   = temp;
         }
      }
   }

   for ( i = 0; i < arrLong; i++ ){
      printf("%4d", arr[i]);
   }

   printf("\n");

   printf("第%d大:%d\n", k, arr[k-1]);

   return 0;
}


方法2:先把前K个元素读入数组并(以递减顺序)对其排序。接着,将剩下的元素再逐个读入。

#include <stdio.h>

int main(){
   int arr[] = {10, 9, 8, 7, 1, 6, 2, 3, 4, 5};
   int k = 5; // 第K大
   int arr2[5];
   int i, j, arrLong, cnt;

   arrLong = sizeof arr / sizeof arr[0];

   for ( i = 0; i < k; i++ ){
      arr2[i] = arr[i];
   }
  
   for ( i = 1; i < k; i++ ){
      for ( j = 0; j < k - 1; j++ ){
         if ( arr2[j+1] > arr2[j] ){
            int temp = arr2[j+1];
            arr2[j+1] = arr2[j];
            arr2[j]   = temp;
         }
      }
   }

   for ( i = k; i < arrLong; i++ ){
      for ( j = 0; j < k; j++ ){
         if ( arr[i] > arr2[j] ){
            if ( j >= k - 1 ){
               // insert at the end
               arr2[k-1] = arr[i];
            }else{
               // move backword
               for ( cnt = k - 1; cnt >= j; cnt-- ){
                  arr2[cnt] = arr2[cnt-1];
               }
               arr2[j] = arr[i];
            }
         }
      }
   }
   
   for ( i = 0; i < k; i++ ){
      printf("%4d", arr2[i]);
   }

   printf("\n"); 

   printf("%d\n", arr2[k-1]);

   return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值