显示错误输出的快速排序算法
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 < j
。 i
和 j
的身体都没有变化。一旦执行进入,它就是加利福尼亚酒店:“你可以随时退房,但你永远不能离开。”
请查看已编辑的问题。
@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<j
而不是 i<j
。 i
永远不会改变,所以 i<j
总是正确的。 n
最终变为 9
。 a[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以上是关于显示错误输出的快速排序算法的主要内容,如果未能解决你的问题,请参考以下文章