15、將兩個數組合並,並順序排列

編程題目:

15.有兩個數組,a[1,3,5,7,9],b[0,2,4,6,8],請將兩個數組合並,並順序排列。

示例代碼:

package program.calculation.exercise15;

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;

/**
 * 15.有兩個數組,a[1,3,5,7,9],b[0,2,4,6,8],請將兩個數組合並,並順序排列。
 */

public class ArrayCombine {
    public static void main(String[] args) {

        int[] a = {1,3,5,7,9};
        int[] b = {0,2,4,6,8};
        int[] arr = new int[a.length+b.length];

        combine1(a,b,arr);

        combine2(a,b,arr);

        int[] array = combine3(a,0,b,0,arr,0);
        System.out.println("\n第三種方式:");
        for(int n : array){
            System.out.print(n+" ");
        }

    }

     // 第一種方式:數組複製
     // 1.Arrays.copyOf(int[] original, int newLength):將一個數組複製進一個空數組中
     //   original:需要複製的數組
     //   newLength:新數組的長度
     // 2.System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length):
     //      將一個數組複製進一個非空數組中
     //   src:需要複製的數組
     //   srcPos:需要複製的數組起始下標
     //   dest:目標數組
     //   destPos:目標數組的起始下標
     //   length:需要複製的數組長度
    private static void combine1(int a[],int b[],int arr[]) {  

        //將a添加進數組arr中   
        arr = Arrays.copyOf(a, a.length+b.length);  
        //將b數組添加到已經含有a數組的arr數組中去  
        System.arraycopy(b, 0, arr, a.length, b.length);  
        //對arr數組進行排序  
        Arrays.sort(arr);  
        System.out.println("第一種方式:");  
        for (int i=0;i<arr.length;i++) {  
            System.out.print(arr[i]+" ");  
        } 

    }  

     // 第二種方式:  使用Queue隊列  
     // 1.Queue.add(Integer e):將元素添加進對列
     // 2.Queue.peek():獲得隊首元素,但不出隊
     // 3.Queue.poll():獲得隊首元素,出隊
    private static void combine2(int a[],int b[],int arr[]) {  

        Queue<Integer> queue_a = new ArrayDeque<Integer>();
        for(int i=0;i<a.length;i++){
            queue_a.add(a[i]);
        }
        Queue<Integer> queue_b = new ArrayDeque<Integer>();
        for(int i=0;i<b.length;i++){
            queue_b.add(b[i]);
        }

        //每循環一次,添加一個最小元素進入arr 
        for (int i=0;i<arr.length;i++) {  
            //兩個隊列都不爲空時,誰小取出誰  
            if (!queue_a.isEmpty() && !queue_b.isEmpty()) {  
                if (queue_a.peek() < queue_b.peek()) {  
                    arr[i] = queue_a.poll();  
                    continue;  
                }else {  
                    arr[i] = queue_b.poll();  
                    continue;  
                }  
            }  
           //當數組a爲空時,取數組b的元素  
           if (queue_a.isEmpty() && !queue_b.isEmpty()) {  
                arr[i] = queue_b.poll();  
                continue;  
           }  
           //當數組b爲空時,取數組a的元素      
           if (queue_b.isEmpty() && !queue_a.isEmpty()) {  
                arr[i] = queue_a.poll();  
                continue;  
           }  
      }

      System.out.println();
      System.out.println("第二種方式:");  
      for (int i = 0; i < arr.length; i++) {  
          System.out.print(arr[i]+" ");  
      }  
   }  

    // 第三種方式:遞歸方法  
    private static int[] combine3(int a[],int a_start,int b[],int b_start,int arr[],int arr_start){  

         //若數組a中的元素都已經放到arr數組中,而數組b未全部放到arr中,  
         //那麼將b中剩餘的元素放到arr中  
         if (a_start >= a.length) {  
              for (int i=arr_start;i<arr.length;i++) {  
                  arr[i] = b[b_start++];  
              }  
              return arr;  
         }  
         //若數組b中的元素都已經放到arr數組中,而數組a未全部放到arr中,  
         //那麼將a中剩餘的元素放到arr中  
         if (b_start >= b.length) {  
             for (int i=arr_start;i<arr.length;i++) {  
                 arr[i] = a[a_start++];  
             }  
             return arr;  
         }      
         //將a數組的頭元素,b數組頭元素中的最小值賦予給arr 
         if (a[a_start] < b[b_start]) {  
             arr[arr_start] = a[a_start];  
             return combine3(a, a_start+1, b, b_start, arr, arr_start+1);  
         }else {  
             arr[arr_start] = b[b_start];  
             return combine3(a, a_start, b, b_start+1, arr, arr_start+1);   
          }  

    } 

}

結果顯示:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章