两个有序数组排序问题(剑指offer第二版55页“举一反三”部分)

问题:

两个有序数组,合并成一个有序数组,假设第一个数组空间足够容纳两个数组。


分析:
考虑到num1数组很大,可以直接在num1数组上进行合并,但是要讲究效率。如果单纯从前往后合并,那么效率会非常低,因为a数组后面的数字需要进行多次的移动,时间复杂度为O(n^2)
换一种思路,我们采用从后往前合并,首先计算出总长度,设置指针num1和num2分别指向原先两个数组的最后一个元素,newIndex表示新的数组的最后一个元素,然后开始对应的元素复制即可,直到num2中的所有元素都被复制进num1

代码如下:

 1 void merge(int *nums1, int m, int *nums2, int n)
 2 {
 3     int newIndex = m + n - 1;
 4     int nums1I = m - 1, nums2I = n - 1;
 5     while (nums1I >= 0 && nums2I >= 0)
 6     {
 7         if (nums1[nums1I] >= nums2[nums2I])
 8         {
 9             nums1[newIndex] = nums1[nums1I];
10             newIndex--;
11             nums1I--;
12         }
13         else
14         {
15             nums1[newIndex] = nums2[nums2I];
16             newIndex--;
17             nums2I--;
18         }
19     }
20     //关于nums1的判决其实可以不需要
21     /*while (nums1I >= 0)
22     {
23         nums1[newIndex] = nums1[nums1I];
24         newIndex--;
25         nums1I--;
26     }*/
27     while (nums2I >= 0)
28     {
29         nums1[newIndex] = nums2[nums2I];
30         newIndex--;
31         nums2I--;
32     }
33 }

 

posted @ 2017-06-09 16:08  皇家大鹏鹏  阅读(436)  评论(0编辑  收藏  举报