【问题标题】:Quicksort: algorithm works only with specific pivot快速排序:算法仅适用于特定的枢轴
【发布时间】:2014-02-08 18:19:47
【问题描述】:

我写了这个快速排序算法的实现。 从理论上讲,快速排序应该使用任何枢轴工作,但我的代码无法正确排序数组。

如果我使用 l 作为支点,算法可以工作,但我无法理解为什么它不能使用 h。有什么想法吗?

public ArrayList<Integer> sort(ArrayList<Integer> array, int l, int h){
    if ((h - l) > 0){
        int splitPoint = partition(array, l, h);
        sort(array, l, splitPoint);
        sort(array, splitPoint +1, h);
    }
    return array;
}

public int partition(ArrayList<Integer> array, int l, int h) {
    int p = h; //with int p = l; the algorithm works
    Integer pivot = array.get(p);

    while(l<h) {
        for (; h>l && array.get(h).compareTo(pivot) >= 0; h--);
        for (; l<h && array.get(l).compareTo(pivot) < 0; l++);

        swap(array, l, h);
    }
    return h;
}

【问题讨论】:

  • 我们无法告诉您未向我们展示的实现有什么问题。您必须向我们展示工作和非工作版本,然后我们才能确定您做错了什么。
  • @RBarryYoung 我试图改写我的问题,但我输入了错误的代码

标签: algorithm sorting quicksort


【解决方案1】:

您可以使用现有的算法。

如果您想选择另一个枢轴,请将其交换到partition 中的第一个位置。

【讨论】:

  • 我的问题有点不同:是否可以编写一个使用任何元素作为枢轴的快速排序算法的实现?
  • 好的,但理论上快速排序应该适用于任何枢轴。使用您的方法,我将回到我的算法。为什么我不能将最后一个用作枢轴?我试图了解我的算法存在哪些问题。我写这个只是作为练习,所以我想写出最好的实现
  • 我也尝试过在互联网上找到的其他实现,但也尝试过那些如果我改变了枢轴,算法不再起作用,我不明白为什么......
  • “用你的方法,我会回到我的算法。” - 我不明白问题是什么。 “为什么我不能将最后一个用作枢轴?” - 你可以。不知道你在做什么,请发布你如何更改partition的代码。
  • 如果我使用这个代码 int p = h;作为支点,算法不再起作用,我试图理解为什么
猜你喜欢
  • 2011-08-31
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多