就地快速冲击困境

时间:2014-02-19 23:29:05

标签: java algorithm quicksort

我现在已经在这个问题上苦苦挣扎了好几个小时。我正在尝试使用pseudocode example在Java中构建就地快速排序。是的,我已尝试逐字实现示例,但它有一个无限循环问题。但无论如何,逻辑看似合理,所以我一直在努力修复它几个小时。

我不能为我的生活找到工作的蠢事 - 这是一个使用简单列表的SSCCE:15, 12, 13。事情按我预期的那样排序,但子列表没有正确分割。如果我删除交换区域中的指针,则不支持重复项。有人可以帮忙,或者指出一个有效的类似实现(我看起来没那么成功)?

SSCCE,没有痕迹:

import java.util.Arrays;
import java.util.List;

public class Quicksort {
public static void main(final String[] args0) {
    List<Integer> unsorted = Arrays.asList(new Integer[]{15, 12, 13});

    int size = unsorted.size();
    int left = 0;
    int right = size - 1;
    int pivot = 13; // Median of first, middle, last. Method removed for brevity.

    while (left < right) {
        while (unsorted.get(left).compareTo(pivot) < 0) {
            left++;
        }

        while (unsorted.get(right).compareTo(pivot) > 0) {
            right--;
        }

        if (unsorted.get(left).compareTo(unsorted.get(right)) > 0) {
            int old = unsorted.get(left);
            unsorted.set(left, unsorted.get(right));
            unsorted.set(right, old);

            if (left + 1 < size) {
                left++;
            }
            if (right - 1 >= 0) {
                right--;
            }
        }           
    }

    System.out.println("List: " + unsorted);
    System.out.println("Sublist left: " + unsorted.subList(0, left));  // Yields [13, 15] 
    System.out.println("Sublist right: " + unsorted.subList(left, size)); // Yields [12]
    // ...then recurse for sublists.
}
}

SSCCE,有痕迹(与上述相同):

import java.util.Arrays;
import java.util.List;

public class Quicksort {
public static void main(final String[] args0) {
    List<Integer> unsorted = Arrays.asList(new Integer[]{15, 12, 13});

    int size = unsorted.size();
    int left = 0;
    int right = size - 1;
    int pivot = 13; // Median of first, middle, last. Method removed for brevity.

    System.out.println("---Processing " + unsorted);
    System.out.println("Median " + pivot);
    System.out.println("Left = " + left + ", right = " + right);

    while (left < right) {
        System.out.println("Start INC/DEC, left = " + left + ", right = " + right);
        while (unsorted.get(left).compareTo(pivot) < 0) {
            left++;
        }

        while (unsorted.get(right).compareTo(pivot) > 0) {
            right--;
        }
        System.out.println("End INC/DEC, left = " + left + ", right = " + right);

        if (unsorted.get(left).compareTo(unsorted.get(right)) > 0) {
            int old = unsorted.get(left);
            unsorted.set(left, unsorted.get(right));
            unsorted.set(right, old);

            if (left + 1 < size) {
                left++;
            }
            if (right - 1 >= 0) {
                right--;
            }

            System.out.println("End swap, left = " + left + ", right = " + right + ", list now " + unsorted);
        }           
        System.out.println("End while, left = " + left + ", right = " + right + ", list now " + unsorted);
    }

    System.out.println("List: " + unsorted);
    System.out.println("Sublist left: " + unsorted.subList(0, left));
    System.out.println("Sublist right: " + unsorted.subList(left, size));
    // ...then recurse for sublists.
}
}

1 个答案:

答案 0 :(得分:1)

您似乎在交换前比较值:

if (unsorted.get(left).compareTo(unsorted.get(right)) > 0)

而参考代码比较索引:

if left ≤ right

另请参阅比较差异:<=而不是>