我的Quicksort似乎停止在完全排序数组之前,并且我盲目地盯着代码。Quicksort没有完全排序提供的数组
private static <T extends Comparable<T>> void quickSort(T[] array,int min, int max){
int pIndex;
if (max-min > 0) {
pIndex = partition(array, min, max);
quickSort(array, min, pIndex-1);
quickSort(array, pIndex+1, max);
}
}
:设计和使用的数据结构(第3版)
快速排序 -
我根据Java软件结构中的相关章节写的算法分区:
private static <T extends Comparable<T>> int partition(T[] array, int min, int max) {
int left, right;
T pivot, temp;
int middle = (min+max)/2;
left = min;
right = max;
pivot = array[middle];
while (left < right) {
while (array[left].compareTo(pivot) <= 0 && left < right)
left++;
while (array[right].compareTo(pivot) > 0)
right--;
if (left<right) {
temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
temp = array[min];
array[min] = array[right];
array[right] = temp;
return right;
}
输入:
包含值的int[10]
阵列0至9,混洗。
快速排序功能因此被称为像:quicksort(nums, 0, nums.length-1)
输出(例如):
0
2
1
3
7
4
5
6
8
9
正如你所看到的,最终产品似乎在途中稍微有一个良好的最终产品,但它在某个地方过早停止。
更新:
到目前为止提供的答案(删除的文件在内)的无工作。如果没有人能够发现错误,那么是否有人会将我重定向到Java中的泛型算法的良好源代码?
我甚至可耻地试图从上面提到的书中完成Quicksort算法的纯副本,并在编译和运行时产生与上面相同的“几乎正确”的输出。然后我质疑它是否可能是我的输入数据,但不是。它只是一个整数数组,没有重复。这是我理解的有效候选人。
您是否考虑将数组的全部内容转储到控制台,并传递“深度计”以便您可以确定递归中的深度发生了什么错误?一个简单的整数将用作深度计。对于大小为10或更小的列表,我想这不会是压倒性的看。 – Rainbolt
我会建议构建一个大约有10个值的测试数组,然后用_手动_首先使用QuickSort(正如你所理解的那样),以便你知道你的算法应该做什么,然后逐步使用调试器(打印出数组),并查看行为何时发生变化。此时开始寻找错误。重复,直到你得到预期的结果。 –
@ThorbjørnRavnAndersen - 比我的建议找到一个Knuth文本,并从那里:) – KevinDTimm