Quicksort给出StackOverFlow错误

时间:2017-07-17 06:21:46

标签: java sorting quicksort

我正在尝试编写quicksort算法。我按照一个在线教程完成了同样的事情,但我收到了StackOverFlow错误。

public void mysort(int[] g) {
    quickSort(g, 0, g.length - 1);

    System.out.println(Arrays.toString(g));
}

public void quickSort(int[] nums, int low, int high) {
    int i = low;
    int j = high;

    int pivot = nums[(low + (high - low)) / 2];

    while (i <= j) {

        while (nums[i] < nums[pivot]) {
            i++;
        }

        while (nums[j] > nums[pivot]) {
            j--;
        }

        while (i <= j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++;
            j--;
        }
    }

    System.out.println(Arrays.toString(nums));

    if (low < j) {
        quickSort(nums, low, j);
    }

    if (i < high) {
        quickSort(nums, i, high);
    }
}

我作为参数传递的数组是[1,2,3,4,5,5,4,3,2,1]。

在quicksort方法中,println语句在第一个循环后输出[1,4,3,2,1,2,3,4,5,5]。

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

您正在计算枢轴错误,但不是:

int pivot = nums[(low + (high - low)) / 2];

是:

int pivot = nums[low +  ((high - low) / 2)];
数学中的

Division优先级高于sumsub

换句话说,你可以把它写成:

int pivot = nums[low +  (high - low) / 2];

你会发现另一个问题,就是在你的时间里,你不是要求枢轴,你要求在枢轴nums[pivot]位置的号码,它应该是:

  while (array[i] < pivot) {
    i++;
  }

  while (array[j] > pivot) {
    j--;
  }

最后,不是交换while i<=j

  if (i <= j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
    i++;
    j--;
  }