Java:插入排序算法交换

时间:2016-01-14 12:32:52

标签: java algorithm insertion-sort

亲爱的Stackoverflowers,

我的swap方法不在insertSort方法中工作;它没有交换我的数组元素。

我的插入排序算法有什么问题?

package AlgoExercises;

import java.util.Arrays;

public class InsertionSort {

  static int[] numbersArray = { 5, 2, 4, 6, 1, 3 };

  static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
  }

  static void insertionSort(int[] numbersArray) {
    for (int i = 1; i < numbersArray.length - 1; i++) {
      int j = i;
      while ((j > 0) && (numbersArray[j] < numbersArray[j - 1])) {
        swap(numbersArray[j], numbersArray[j - 1]);
        j = j - 1;
        System.out.println(Arrays.toString(numbersArray));
      }
    }
  }

  public static void main(String args[]) {
    insertionSort(numbersArray);
  }
}

解决方案:

修复了交换方法,其中int []包含在其参数中,现在交换工作正常!我还将numbersArray.length-1编辑为numbersArray.length。

感谢您的帮助!

package AlgoExercises;

import java.util.Arrays;

public class InsertionSort {

  static int[] numbersArray = { 5, 2, 4, 6, 1, 3 };

  static void swap(int i, int j) {
    int temp = numbersArray[j];
    numbersArray[j] = numbersArray[i];
    numbersArray[i] = temp;
  }

  static void insertionSort(int[] numbersArray) {
    for (int i = 1; i < numbersArray.length; i++) {
      int j = i;
      while ((j > 0) && (numbersArray[j] < numbersArray[j - 1])) {
        swap(j, j - 1);
        j = j - 1;
        System.out.println(Arrays.toString(numbersArray));
      }
    }
  }

  public static void main(String args[]) {
    insertionSort(numbersArray);
  }
}

2 个答案:

答案 0 :(得分:1)

Java是一种按值传递的语言,因此交换传递给int方法的swap变量没有任何区别。你应该传递数组本身+两个索引来交换方法,并在交换方法中修改数组。

static void swap(int[] arr, int i, int j) {
    int temp = arr[j];
    arr[j] = arr[i];
    arr[i] = temp;
}

并将其命名为

swap(numbersArray, j, j-1);

请注意,我没有检查插入排序实现的逻辑。这个答案只涉及掉期问题。

答案 1 :(得分:1)

只是为了让您了解为什么现有的swap方法不起作用:如果您编写这样的代码:

void swap(int a, int b) {
  int t = a;
  a = b;
  b = t;
}

void callSwap() {
  int x = 1;
  int y = 2;

  swap(x, y);

  System.out.println(x + ", " + y);
}

您可以'内联'swap方法,基本上将其复制到callSwap方法中。语义上等效的代码是:

void callSwap() {
  int x = 1;
  int y = 2;

  // Start of inlined swap method.
  {
    int a = x;
    int b = y;

    int t = a;
    a = b;
    b = t;
  }
  // End of inlined swap method.

  System.out.println(x + ", " + y);
}

希望您不希望xy有交换值。

请注意,此行为与变量名abxy不同的事实无关;我只是选择它们来区别。如果swap的参数名为xy,则需要在内联时将其重命名为其他内容,因为它们与x和{{完全分开1}} y