zoukankan      html  css  js  c++  java
  • 选取两个有序数组中最大的K个值,降序存入另一个数组中

    原题:

    假设有两个有序的整型数组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. }  
  • 相关阅读:
    [书目20130415]改变:28天让自己内心强大
    [引]软件著作权登记申请所需文件
    [转]动软代码生成器之模板功能介绍
    [转]C# 冒泡排序你还会吗?
    [转]细说ASP.NET Forms身份认证
    [转]listview加载性能优化ViewHolder
    [转]App for Android (2) —— Python篇
    [转]sqlserver 创建分区表
    [转]c# 四舍五入、上取整、下取整
    常用 Java 静态代码分析工具的分析与比较
  • 原文地址:https://www.cnblogs.com/batys/p/3330045.html
Copyright © 2011-2022 走看看