[英]C.A.R. Hoare Quicksort implementation in Java
我正在嘗試對整數數組實施 QuickSort。
除了分區之外,我所有的方法都可以正常運行。 分區從獲取中點開始,然后排序,首先,中間,最后。
出來 {1,6,5,4,3,2,7}
然后在這之后的某個地方我得到 {1, 2, 5, 3, 4, 7, 6} 作為最終結果
誰能告訴我哪里可以調整?
預期輸出應為 {1,2,3,4,5,6,7}
import java.util.Arrays;
public class Test {
public static void main(String[]args) {
int [] a = {7,6,5,4,3,2,1};
quickSort(a);
System.out.println(Arrays.toString(a));
}
public static void quickSort( int [] a) {
quickSort(a,0,a.length - 1);
}
public static void quickSort(int [] a,int start,int end) {
if(start<end) {
int pivotIndex = partition(a, start, end);
quickSort(a,start,pivotIndex-1); // sort left partition
quickSort(a,pivotIndex+1,end); // sort right partition
}
}
public static int partition(int [] a, int start, int end) {
int mid =midpoint(start,end);
sortFirstMiddleLast(a,start,mid,end);
swap(a,start,end-1);
int pivotIndex = end -1;
int pivotValue = pivotIndex;
int indexFromLeft = start +1;
int indexFromRight = end -2;
boolean done = false;
while (!done) {
while (a[indexFromLeft]<a[pivotValue]) {
indexFromLeft++;
}
while (a[indexFromRight]>a[pivotValue]) {
indexFromRight--;
}
if (indexFromLeft < indexFromRight) {
swap(a,indexFromLeft,indexFromRight);
indexFromLeft++;
indexFromRight--;
}
else {
done=true;
}
}
swap(a,pivotIndex,indexFromLeft);
pivotIndex=indexFromLeft;
return pivotIndex;
}
public static void sortFirstMiddleLast(int [] a, int start, int mid, int end) {
if (a[start]>a[mid]) {
swap(a,start,mid);
}
else if (a[mid]>a[end]) {
swap(a,mid,end);
}
else if (a[start]>a[end]) {
swap(a,start,end);
}
else if(a[start] > a[mid]) {
swap (a,start,mid);
}
}
private static void swap(int[] a, int first, int second) {
int temp = a[first];
a[first] = a[second];
a[second] = temp;
}
private static int midpoint(int first, int last) {
return first + (last - first) / 2;
}
}
檢查是否開始 =< array.size -1 和 end >= 0 在行之后執行進一步:
int indexFromLeft = start +1;
int indexFromRight = end -2;
在該條件下終止遞歸。
如果您使用下面創建的類,就不會有任何問題。
class QuickSort{
int partition(int arr[], int low, int high)
{
int pivot = arr[high];
int i = (low-1);
for (int j=low; j<high; j++)
{
if (arr[j] <= pivot)
{
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i+1];
arr[i+1] = arr[high];
arr[high] = temp;
return i+1;
}
void sort(int arr[], int low, int high)
{
if (low < high)
{
int pi = partition(arr, low, high);
sort(arr, low, pi-1);
sort(arr, pi+1, high);
}
}
試試這個
swap(a,start,end-1);
int pivotIndex = end -1; // removed -1
int pivotValue = pivotIndex;
int indexFromLeft = start +1; // removed +1
int indexFromRight = end -2; // removed -2
public static int partition(int [] a, int start, int end) {
int mid =midpoint(start,end);
sortFirstMiddleLast(a,start,mid,end);
swap(a,start,end-1);
int pivotIndex = end ;
int pivotValue = pivotIndex;
int indexFromLeft = start ;
int indexFromRight = end;
boolean done = false;
while (!done) {
while (a[indexFromLeft]<a[pivotValue]) {
indexFromLeft++;
}
while (a[indexFromRight]>a[pivotValue]) {
indexFromRight--;
}
if (indexFromLeft < indexFromRight) {
swap(a,indexFromLeft,indexFromRight);
indexFromLeft++;
indexFromRight--;
}
else {
done=true;
}
}
swap(a,pivotIndex,indexFromLeft);
pivotIndex=indexFromLeft;
return pivotIndex;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.