簡體   English   中英

無法弄清楚我的合並排序代碼有什么問題

[英]Can't figure out what is wrong with my merge sort code

我看了很多遍,我不確定我做錯了什么。 他的邏輯似乎沒問題,但它只打印出第一個數字。 我省略了主要方法:

public class MergeSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] bob = {4,7,99,8,12,6};

        Mergesort(bob);

        for(int i=0; i< bob.length; i++){
            System.out.print(bob[i]+",");
        }
    }

    public static int[] Mergesort(int[] bob){

        int length = bob.length;
        int mid = bob.length/2;
        if(length <= 1){
            return bob;
        }

        int[] left = new int[mid];
        int[] right = new int[length-left.length];

        for(int i=0; i< mid; i++){
            left[i]=bob[i];
        }
        for(int j=mid; j< length; j++){
            right[j-mid]=bob[j];
        }

        Mergesort(left);
        Mergesort(right);
        merge(left,right, bob);
        return bob;
    }

    //this is merge method
    public static int[] merge(int[] left, int[] right, int[] bob){
        int l= left.length;
        int r = right.length;

        int i=0, j=0,k=0;

        while(i<l && j<r){
            if(left[i]<=right[j]){
                bob[k] = left[i];
                i++; 

            }
            else
            {
                bob[k] = right[j];
                j++;

            }
            k++;
        }

        while(i<l){
            bob[k] = left[i];
            i++;
            k++;
        }
        while(j<r){
            bob[k] = bob[j];
            j++;
            k++;
        }

        return bob;

    }

}

我相信您的錯誤在merge()中的這一行:

        bob[k] = bob[j];

它應該是

        bob[k] = right[j];

通過此更改,我得到了以下輸出:

4,6,7,8,12,99,

我將向您展示如何通過測試/調試快速找出答案,而不僅僅是告訴您答案。 你知道,“教人釣魚”等等( 來源)。

因此,讓我們測試您的merge方法。 我修改了 main 方法,只合並兩個排序的數組{1, 3, 5}{2, 4, 6} 我們知道輸出應該是{1, 2, 3, 4, 5, 6}

同時,讓我們調試一下。 最原始的調試方式被稱為“printf 調試”,這意味着我們只是在代碼中放置了大量日志語句,以便我們可以看到每一步的內部狀態。 我在修改merge輸出數組的地方添加了日志記錄。 目標是觀察以不正確/意外方式修改的那一刻。

這是帶有這兩個修改的代碼:

public class MergeSort {

  public static void main(String[] args) {
    int[] left = {1, 3, 5};
    int[] right = {2, 4, 6};
    int[] merged = {0, 0, 0, 0, 0, 0};
    merge(left, right, merged);
  }

  public static int[] merge(int[] left, int[] right, int[] bob) {
    System.out.print("Before merge: ");
    System.out.println(Arrays.toString(bob));
    int l = left.length;
    int r = right.length;

    int i = 0, j = 0, k = 0;

    while (i < l && j < r) {
      if (left[i] <= right[j]) {
        bob[k] = left[i];
        System.out.print("Merge step 1: ");
        System.out.println(Arrays.toString(bob));
        i++;

      } else {
        bob[k] = right[j];
        System.out.print("Merge step 2: ");
        System.out.println(Arrays.toString(bob));
        j++;

      }
      k++;
    }

    while (i < l) {
      bob[k] = left[i];
      System.out.print("Merge step 3: ");
      System.out.println(Arrays.toString(bob));
      i++;
      k++;
    }
    while (j < r) {
      bob[k] = bob[j];
      System.out.print("Merge step 4: ");
      System.out.println(Arrays.toString(bob));
      j++;
      k++;
    }

    return bob;
  }
}

這是輸出:

Before merge: [0, 0, 0, 0, 0, 0]
Merge step 1: [1, 0, 0, 0, 0, 0]
Merge step 2: [1, 2, 0, 0, 0, 0]
Merge step 1: [1, 2, 3, 0, 0, 0]
Merge step 2: [1, 2, 3, 4, 0, 0]
Merge step 1: [1, 2, 3, 4, 5, 0]
Merge step 4: [1, 2, 3, 4, 5, 3]

那么,您的代碼中的問題在哪里? 顯然在“合並步驟 4”中,或者行bob[k] = bob[j]; . 多么酷啊? 通過幾個簡單的print調用,我們已經找到了您的錯誤的確切行!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM