[英]Quicksort (Random Pivot) code not sorting correctly Java
代碼是一個帶有隨機數據的快速排序算法。 它沒有完全對隨機數組進行排序; 我無法弄清楚為什么。 錯誤似乎與遞歸調用和交換的邊界有關。
public static <E extends Comparable<E>> void quickerSort(ArrayList<E> input, int lower, int higher){
int first = lower;
int last = higher;
if (lower >= higher)
return;
//generates the random pivot
int pivot = rand.nextInt(higher-lower+1) + lower;
//moves the pivot to the beginning of the list
E temp = input.get(first);
input.set(first, input.get(pivot));
input.set(pivot, temp);
pivot = first;
first++;
//if the values on the left side of the array are less than the
//value of the pivot, first is incremented (first part of loop) until
//a greater value is reached
//if the values on the right side of the array are greater than the
//value of the pivot, last is incremented until a lesser value is reached
while (first < last){
while (input.get(first).compareTo(input.get(pivot)) <= 0 && first < last){
first++;
}
while(input.get(last).compareTo(input.get(pivot)) > 0 && last >= first){
last--;
}
//switches the two values reached through the while loops
if (first < last){
temp = input.get(first);
input.set(first, input.get(last));
input.set(last, temp);
}
}
//moves the pivot to where first is
temp = input.get(first-1);
input.set(first-1, input.get(pivot));
input.set(pivot, temp);
//calls the method recursively
if (lower < first-1){
quickerSort(input,lower,first-1);
}
if (first < higher){
quickerSort(input,first,higher);
}
}
//實現方法
public static void testQuickSort(){
//creates a random list of integers to be sorted and prints it
ArrayList<Integer> list = new ArrayList<Integer>();
Random rand = new Random();
for (int i = 0; i <= 19; i++){
list.add(rand.nextInt(100));
System.out.print(list.get(i)+" ");
}
//calls quicksort and then prints the sorted array
System.out.println();
Assignment2.quickSort(list);
for (int i = 0; i <= 19; i++){
System.out.print(list.get(i)+" ");
}
}
你的代碼不能用於簡單輸入{6,0},因為你的first
和last
都將指向第二個元素,因此,6和0永遠不會被交換。
我修改了你的代碼並且它有效。 我使用的變量名在這里更有意義,但邏輯是一樣的。
public static <E extends Comparable<E>> void quickSort(ArrayList<E> input, int low, int high) {
if (low >= high)
return;
// generates the random pivot
int pivotIndex = new Random().nextInt(high - low + 1) + low;
E pivot = input.get(pivotIndex);
// moves the pivot to the beginning of the list
Collections.swap(input, pivotIndex, low);
int i = low;
int j = high;
// if the values on the left side of the array are less than the
// value of the pivot, first is incremented (first part of loop) until
// a greater value is reached
// if the values on the right side of the array are greater than the
// value of the pivot, last is incremented until a lesser value is
// reached
while (i <= j) {
while (input.get(i).compareTo(pivot) <= 0 && i < j) {
i++;
}
while (input.get(j).compareTo(pivot) > 0 && j >= i) {
j--;
}
// break here when two pointers meet since the pivot position has been found
if (i >= j)
break;
// switches the two values reached through the while loops
Collections.swap(input, i, j);
}
// moves the pivot to where j is
Collections.swap(input, low, j);
// calls the method recursively
quickSort(input, low, j - 1);
quickSort(input, j + 1, high);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.