【问题标题】:Generics Broken Quicksort泛型损坏的快速排序
【发布时间】:2019-08-20 15:10:39
【问题描述】:

我的导师建议我应该在 stackover flow 上发布我的问题,因为这不是我的教授所涵盖的内容(他将涵盖它)。仍然是一个档次。我了解快速排序,我的程序的其余部分都可以工作,但无论我尝试什么,我的快速排序都无法正常工作。

这个作业是为了让我们自己练习使用泛型。我们的教授没有教我们怎么做;他希望我们学习。我尝试过:CompareTo, 的循环操作数。尝试阅读教科书,但没有找到解决我问题的方法。我也尝试与我的项目合作伙伴合作,但他们放弃了课程并拒绝帮助我。它仍然是一个等级,所以我自己完成它。我只是发布代码的相关部分

     public static <E extends Comparable> int partition(E[] list,int low, int high) {
    E pivot =  list[low];
    int i = low - 1;
    int j = high + 1;
    while (i < j)
    {
    for (i++; (int) list[i] < pivot i++);
    for (j--; (int) list[j] > pivot; j--);
    if (i < j)
    swap(i, j);
    }
    return j;
    }
    }

输出应该从驱动程序产生一个排序列表。

【问题讨论】:

  • ; 终止您的循环体,因此您有两个空的 for 循环,然后在 while 中有一个 if。另外,你为什么要比较ij?你付钱给你的导师吗?
  • 您好,欢迎您!首先,“这个作业是为了让我们自己练习使用泛型。”似乎从导师那里获得建议,在小组中工作并在 StackOverflow 上发帖违背了作业的目的。无论如何,您遇到的实际问题是什么? “它不会起作用”并不是一个明确的问题陈述。
  • 这是我的各个雇主都使用过的 Java 代码样式指南:可选大括号不是可选的。也就是说,你不会说 if (condition) blah。你会说 if (condition) { blah }。虽然该语言允许代码块使用单行(if、for、while 等),而且排除大括号也不会那么草率,但它会让您看到一大类编程错误,这些错误可能很微妙。因此,我们不会将可选大括号视为可选,因此我们不会遇到那些奇怪的错误类别。
  • 你了解递归了吗?我尝试查找可以使用的好教程,但它们似乎都使用递归。
  • 我自己学了一点递归。我想我明白了。

标签: java arraylist casting quicksort


【解决方案1】:

上面的代码类似于 Hoare 分区方案。对于已排序的数据,选择 [low] 作为枢轴将是最坏的情况,如果选择 [high] 作为枢轴,典型的 Hoare 方案将无限递归。其中一个 for 循环似乎缺少内部分号。下面是一个典型的 Hoare 分区方案。

    public static <E extends Comparable> void quicksort(E[] list, int low, int high)
    {
        if(low >= high)
            return;
        int index = partition(list, low, high);
        quicksort(list, low, index);
        quicksort(list, index+1, high);
    }

    public static <E extends Comparable> int partition(E[] list, int low, int high)
    {
        E pivot = list[low+(high-low)/2];
        int i = low - 1;
        int j = high + 1;
        while (true)
        {
            while(list[++i].compareTo(pivot) < 0);
            while(list[--j].compareTo(pivot) > 0);
            if(i >= j)
                break;
            E temp = list[i];
            list[i] = list[j];
            list[j] = temp;
        }
        return j;
    }

为了避免最坏情况数据模式的堆栈溢出:

    public static <E extends Comparable> void quicksort(E[] list, int low, int high)
    {
        while(low < high)
        {
            int index = partition(list, low, high);
            if((index - low) <= (high - index)){
                quicksort(list, low, index);
                low = index+1;
            } else {
                quicksort(list, index+1, high);
                high = index;
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多