Merge Sorted Array --合并数组

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

意思:把两个有序数组合并为一个有序数组,但不能增加辅助数组,只能合并到nums1数组;

思路:

    1.归并排序,在后面往回扫比较,不然会覆盖nums1原来的数据;

    2.插入排序,逐个比较,找到合适的插入位置。

 

1.归并排序代码实现如下:

class Solution {    
    public void merge(int[] nums1, int m, int[] nums2, int n) {    
        if(nums1==null || nums2==null)         
            return;      
        int idx1 = m-1; 
        int idx2 = n-1; 
        int len = m+n-1;
        while(idx1>=0 && idx2>=0){    //当两者大于0时
            if(nums1[idx1]>nums2[idx2]){ 
                nums1[len--] = nums1[idx1--];          
            }else{ 
                nums1[len--] = nums2[idx2--];      
            }    
        }       
        while(idx2>=0){  //将剩下的添加到nums1中
            nums1[len--] = nums2[idx2--];   
        }    
    }
}
//风骚写法
public void merge(int A[], int m, int B[], int n) {
    int i=m-1, j=n-1, k=m+n-1;
    while (i>-1 && j>-1) A[k--]= (A[i]>B[j]) ? A[i--] : B[j--];
    while (j>-1)         A[k--]=B[j--];
}

 

2.插入排序代码:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
    int i,j;
    for(i = m;i<m+n;i++){
        j = i-1;    //从nums1的数组后面开始找插入位置
        int tmp = nums2[i-m];         //tmp存储要插入的数据
        while( j>=0 && tmp<nums1[j]){   //找插入位置
            nums1[j+1] = nums1[j];
            j--;
        }
        nums1[j+1]=tmp;
     }
    }
}    

 

posted @ 2017-10-15 16:05  im.lhc  阅读(124)  评论(0)    收藏  举报