我正在尝试在java中编写一个简单的方法,它会对int []执行quicksort,但我会在结果中得到一个不合适的值。
任何帮助,以了解我出错的地方将不胜感激。以下是我的代码:
public static void quickSort(int[] arr, int left, int right){
if (left < right){
int p = partition(arr, left, right);
quickSort(arr, left, p-1);
quickSort(arr, p+1, right);
}
}
public static int partition(int[] arr, int left, int right){
int pivot = arr[left];
int l = left+1;
int r = right;
while (l < r){
while (l<right && arr[l] < pivot){
l++;
}
while (r>left && arr[r] > pivot){
r--;
}
if (l < r){
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
}
arr[left] = arr[r];
arr[r] = pivot;
return r;
}
答案 0 :(得分:0)
您的代码非常完美,但请确保为方法quickSort提供正确的值。
int[] arr = .....;
int left = 0;
int right = arr.length - 1;
public static void quickSort(int[] arr, int left, int right){
答案 1 :(得分:0)
这两行是可疑的:
var ss = SpreadsheetApp.create(name, rows, columns);
var myNumColumns = ____; //or defined in the function call
var newSheet = ss.insertSheet(sheetName, sheetIndex, options);
var columnsToDelete = newSheet.getLastColumn() - myNumColumns;
newSheet.deleteColumns((myNumColumns-1), columnsToDelete);
和
quickSort(arr, p+1, right);
当你选择右侧分区时,你是否正在跳过数组的第一个元素?一些示例测试用例及其输出可用于添加。
答案 2 :(得分:0)
我更改了分区方法。我尝试做一些小改动,主要是为了打破循环。
public static int partition(int[] arr, int left, int right) {
int pivot = arr[left];
int l = left ;
int r = right+1;
while (true) {
while (arr[++l] < pivot) {
if (l >= right)
break;
}
while (arr[--r] > pivot) {
if (r <= left)
break;
}
if (l >= r)
break;
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
arr[left] = arr[r];
arr[r] = pivot;
return r;
}
我测试了下面的场景并且它正在运行。
int[] arr = { 9, 5, 10, 8, 2, 3, 4, 7, 6, 1 };
int[] arr = { 9, 5, 10, 8, 2, 9, 5, 10, 8, 2 };
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
答案 3 :(得分:0)
Hoare分区方案在快速排序调用中使用p和p + 1。我将一个有效的C程序转换为Java。我将枢轴切换到中间,因此排序或反向排序的数组不是最坏的情况。
public static void quickSort(int[] arr, int left, int right){
if (left < right){
int p = partition(arr, left, right);
quickSort(arr, left, p);
quickSort(arr, p+1, right);
}
}
public static int partition(int[] arr, int left, int right){
int pivot = arr[(left+right)/2];
int l = left-1;
int r = right+1;
while (true){
while (arr[++l] < pivot);
while (arr[--r] > pivot);
if (l >= r)
break;
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
}
return r;
}