我正在学习数据结构和算法。所以我尝试实现快速排序算法。
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[] { 10, 16, 8, 12, 15, 6, 3, 9, 5 };
quickSort(0, arr.length - 1, arr);
}
public static void quickSort(int start, int end, int[] arr) {
if (start < end) {
int partitionIndex = partition(start, end, arr);
quickSort(start, partitionIndex - 1, arr);
quickSort(partitionIndex+1, end, arr); // When passing partitionIndex+1 in the swap method it throws index out of bound exception
System.out.println(Arrays.toString(arr));
}
}
public static int partition(int start, int end, int[] arr) {
int pivot = arr[end];
int pIndex = start;
for (int i = 0; i < end - 1; i++) {
if (arr[i] <= pivot) {
swap(i, pIndex, arr);
pIndex++;
}
}
swap(pIndex, end, arr);
return pIndex;
}
private static void swap(int i, int index, int[] arr) {
int temp = arr[i];
arr[i] = arr[index]; // index out of bound exception is thrown
arr[index] = temp;
}
在进行递归调用quickSort(partitionIndex+1, end, arr);
时,在swap
方法中它抛出index out of bound exception
。因为没有这样的索引来检索/存储值。
谁能帮我解决这个问题?
答案 0 :(得分:1)
我假设您尝试实施Wikipedia中的 Lomuto分区方案。如果是这种情况,则您的代码中有2个错误,都在for
方法的partition
循环中出现:
您的算法每次都从 0 开始。这导致了IndexOutOfBoundsException
,因为它交换了最后的pIndex
array.length
。如果您解决此问题,该异常将消失,但您的排序结果将是[3, 5, 8, 10, 12, 15, 6, 16, 9]
,显然排序并不理想。
这里的错误是,由于您的结束条件是i < end - 1
,因此每次都丢失了最后一个迭代,将其更改为i < end
或i <= end - 1
,您应该得到一个完美的结果:< / p>
[3, 5, 6, 8, 9, 10, 12, 15, 16]
为完成此操作,请使用固定的partition
方法和您的quickSort
方法:
public static void quickSort(int start, int end, int[] arr) {
if (start < end) {
int partitionIndex = partition(start, end, arr);
quickSort(start, partitionIndex - 1, arr);
quickSort(partitionIndex + 1, end, arr);
}
}
public static int partition(int start, int end, int[] arr) {
int pivot = arr[end];
int pIndex = start;
for (int i = start; i < end; i++) {
if (arr[i] < pivot) {
swap(pIndex, i, arr);
pIndex++;
}
}
swap(pIndex, end, arr);
return pIndex;
}