显示错误输出的快速排序算法

Posted

技术标签:

【中文标题】显示错误输出的快速排序算法【英文标题】:Quick Sort Algorithm showing Wrong Output 【发布时间】:2014-06-26 13:16:31 【问题描述】:

我已经编写了快速排序的代码,但它显示异常数组索引超出范围。这在用 C 编写时可以正常工作,但在 Java 中它不起作用。请告诉它有什么问题。感谢任何建议。它是双向划分标准 CLRS 算法。

package Sorting;

public class QuickSort 

    public static void main(String arg[]) 
        int a[] =  9, 8, 7, 6, 5, 4, 3, 2, 1 ;

        Sort(a, 0, a.length - 1);
        for (int i = 0; i < 9; i++) 
            System.out.print(" " + a[i]);
        

    

    private static void Sort(int[] a, int i, int j) 
        // TODO Auto-generated method stub
        if (i < j) 
            int k = Partition(a, i, j);
            Sort(a, i, k - 1);
            Sort(a, k + 1, j);

        
    

    private static int Partition(int[] a, int i, int j) 
        // TODO Auto-generated method stub
        int temp;
        int x = a[j];
        int l = i - 1;
        for (int n = i; n < j; n++) 
            if (a[n] >= x) 
                l++;
                temp = a[l];
                a[l] = a[n];
                a[n] = temp;
            
        
        temp = a[x];
        a[x] = a[l + 1];
        a[l + 1] = temp;
        return l + 1;

    

输出:9 3 5 7 4 1 6 2 8

【问题讨论】:

错误出现在哪里? 我不想花时间进入这里的逻辑,但错误是在你的分区中的 for 循环中。 for (int n = i; i 从表面上看,Partition 是行不通的。请参阅for 循环。条件为i &lt; jij 的身体都没有变化。一旦执行进入,它就是加利福尼亚酒店:“你可以随时退房,但你永远不能离开。” 请查看已编辑的问题。 @I-LOVE-2-REVIVE 请查看更新后的问题 【参考方案1】:

你的代码有一些小错误,这里是更新的代码:

    private static int Partition(int[] a, int i, int j) 
    // TODO Auto-generated method stub      
    int temp;
    int x = a[j];
    int l = i - 1;
    for (int n = i; n < j; n++) 
        if (a[n] <= x)       /*******Condition was wrong******/
            l++;
            temp = a[l];
            a[l] = a[n];
            a[n] = temp;
        
    
    temp = a[j];      /******a[j] not a[x] x is value of pivot element******/
    a[j] = a[l + 1];
    a[l + 1] = temp;
    return l + 1;

【讨论】:

【参考方案2】:

partition的这个循环中:

for (int n = i; i < j; n++)

您的意思可能是 n&lt;j 而不是 i&lt;ji 永远不会改变,所以 i&lt;j 总是正确的。 n 最终变为 9a[9] 不存在,所以异常。

【讨论】:

现在显示错误的输出,排除异常。 异常已删除 = 您的问题已得到解答。现在您需要调试它为什么不起作用 :-) 请发布任何具体问题,我们可以提供帮助。 好的,但问题现在已更新。如果您能提供帮助,请帮忙。感谢您的努力。【参考方案3】:

i 总是低于j 因为我没有改变

for (int n = i; i < j; n++)

所以你有一个无限循环。

【讨论】:

否,因为a[n] 会在 n>=a.size() 时立即引发异常 @ammoQ 没错。但是 n > a.size() 因为无限循环。 @user3728933 “为什么我的代码不起作用”这个问题是题外话。 @Jenes 不工作输出为 1 3 5 4 6 7 2 8 9 Here you have a working implementation

以上是关于显示错误输出的快速排序算法的主要内容,如果未能解决你的问题,请参考以下文章

3047: 快速排序算法

交换算法引起的快速排序错误

用C语言编程实现快速排序算法

java算法----排序----快速排序

500,000 个已排序整数数组上的 C++ 快速排序算法中的 Seg 错误

排序---快速排序