java - java中的快速排序列表

标签 java list quicksort

我正在尝试使用 java 练习快速排序列表,我认为这是正确的,但它显示“主线程中的异常...”

public class QuickSort {

  public static void sort(List<Integer> list) {
    sort(list, 0, list.size() - 1);
  }

  public static void sort(List<Integer> list, int from, int to) {
    if (list.size() <= 1) {
        return;
    }
    int pivot = from;
    int left = from + 1;
    int right = to;
    while (left < right) {
        while (list.get(pivot) >= list.get(left)) {
            left++;
        }
        while (list.get(pivot) <= list.get(right)) {
            right--;
        }
        if (left < right) {
            Collections.swap(list, left, right);
        }
    }
    Collections.swap(list, pivot, left - 1);
    sort(list, from, pivot - 1);
    sort(list, pivot + 1, to);
  }
}

最佳答案

你的问题在这里:

while (list.get(pivot) <= list.get(right)) {
        right--;
    }

因为,在最坏的情况下,比如一个已经排序的 list,您的 right-- 将是负数。

看看下面的代码,这会给你一个想法:

public static void quicksort(List<Integer> list, int left, int right) {
    int q;
    if (right > left) {
        q = partition(list, left, right);
        // after ‘partition’
        // list[left..q-1] ≤ list[q] ≤ list[q+1..right]
        quicksort(list, left, q - 1);
        quicksort(list, q + 1, right);
    }
}

static int partition(List<Integer> list, int left, int right) {
    int P = list.get(left);
    int i = left;
    int j = right + 1;
    for (;;) { // infinite for-loop, break to exit
        while (list.get(++i) < P)
            if (i >= right)
                break;
        // Now, list[i]≥P
        while (list.get(--j) > P)
            if (j <= left)
                break;
        // Now, list[j]≤P
        if (i >= j)
            break; // break the for-loop
        else
            // swap(list[i],list[j]);
            Collections.swap(list, i, j);
    }
    if (j == left)
        return j;
    // swap (list[left],list[j]);
    Collections.swap(list, left, j);
    return j;
}

查看演示运行 here .

关于java - java中的快速排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30971520/

相关文章:

java 泛型 - 将 List<object> 转换为 List<T>

java - 在 Lucene 中,我可以搜索一个索引但使用另一个索引中的 IDF 吗?

c# - 初始化多个 List<Boolean> 与多个 List<String>

python - Python 中的快速排序抛出 RecursionError

c - C 中使用 char 数组进行快速排序

java - Java 中的线程安全双向关联

java - 以制表符作为引号字符的 CSV

r - 在 R 中将数组列表转换为数组数组(保留子数组的形状)

python - 根据索引减少列表

java - QuickSort 给出错误的排序顺序