代码改变世界

选取两个有序数组中最大的K个值,降序存入另一个数组中

2013-09-19 22:37  Batys  阅读(572)  评论(0编辑  收藏  举报

原题:

假设有两个有序的整型数组int *a1, int *a2,长度分别为m和n.试用C语言写出一个函数选取两个数组中最大的K个值(K可能大于m+n)写到int *a3中,保持a3降序,并返回a3实际的长度。

 

函数原型为int merge(int *a3, int *a1, int m, int *a2, int n, int k)
解题思路:此题为两个有序数组的合并:
 设置两个下标索引 i和j,逐个比较a1[i]和a2[j],大的进入a3;
 当a1或者a2已经全部被排序,就将另一个数组部分拷贝到a3.
 
  1. #include <stdio.h>  
  2. int merge(int *a3, int *a1, int m, int *a2, int n, int k)  
  3. {  
  4.     int i, j, t;  
  5.       
  6.     if(k > m+n)  
  7.         k = m+n;  
  8.     for(i = 0, j = 0,  t = 0; t < k; t++)  
  9.     {  
  10.         if(i == m) //若a1片段已经全部被排序   
  11.         {     
  12.             while(j <= k-m)  
  13.                 a3[t++] = a2[j++];  
  14.             break;  
  15.         }  
  16.         else if(j == n)  //若a2片段已经全部被排序   
  17.         {     
  18.             while(i <= k-n)  
  19.                 a3[t++] = a2[i++];  
  20.             break;  
  21.         }  
  22.           
  23.         if(a1[i] > a2[j])  
  24.         {     
  25.             a3[t] = a1[i];  
  26.             i++;  
  27.         }  
  28.         else if(a1[i] <= a2[j])  
  29.         {     
  30.             a3[t] = a2[j];  
  31.             j++;  
  32.         }  
  33.     }     
  34.     return k;  
  35. }  
  36. int main()  
  37. {  
  38.     int a1[7] = {19,14,13,12,9,6,5};  
  39.     int a2[9] = {100,56,34,16,10,7,6,3,1};  
  40.     int a3[20];  
  41.     int len, k, i;  
  42.     for(i = 0; i<7; i++)  
  43.         printf(" %d ", a1[i]);  
  44.     printf("/n");  
  45.       
  46.     for(i = 0; i<9; i++)  
  47.         printf(" %d ", a2[i]);  
  48.     printf("/n");  
  49.     printf("insert k =");  
  50.     scanf("%d", &k);  
  51.           
  52.     len = merge(&a3, &a1, 7, &a2, 9, k);  
  53.       
  54.     for(i = 0; i < len; i++)  
  55.           printf(" %d ", a3[i]);  
  56.     printf("/n");  
  57.     printf("len = %d/n", len);  
  58.     system("pause");  
  59. }