![](/img/trans.png)
[英]Quicksort partition algorithm loop invariants defined in partition method
[英]QuickSort partition algorithm
我正在嘗試使用Cormen算法教科書編寫快速排序算法。 以下是我的代碼。
class Quicksort
{
public void qSort(int[] a, int p, int r)
{
if(p<r)
{
int q = Partition(a, p,r);
qSort(a, p, q-1);
qSort(a, q+1, r);
}
}
private int Partition(int[] a, int p, int r)
{
int x = a[r];
int i = p-1;
int temp=0;
for(int j=p; j<r-1; j++)
{
if(a[j]<=x)
{
i++;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
temp = a[i+1];
a[i+1] = a[r];
a[r] = temp;
return (i+1);
}
}
public class QuickSortTest
{
public static void main(String[] args)
{
Quicksort qsort = new Quicksort();
int[] array = {5, 4, 7, 2, 1, 9, 3, 6, 10, 8};
System.out.print("Original Array : ");
for(int i=0; i<array.length;i++)
{
System.out.print(array[i] + " ");
}
int length = array.length;
qsort.qSort(array, 0, length-1);
System.out.print("Sorted Array : ");
for(int i=0; i<array.length;i++)
{
System.out.print(array[i] + " ");
}
}
}
但是,當我執行此代碼時,輸出錯誤。
Original Array : 5 4 7 2 1 9 3 6 10 8
Sorted Array : 1 4 5 2 6 7 3 8 9 10
任何人都可以解釋有什么問題。 我完全按照“算法簡介”一書中的說明實現了這段代碼。 謝謝。
不,你沒有直接復制它:)我在這里...
for(int j=p; j<r-1; j++)
應該
for(int j=p; j<r; j++)
要么
for(int j=p; j <= r-1; j++)
這本書寫道:
for j = p to r - 1
其中包括r - 1
。 並且記住這本書的數組是從1而不是0開始。所以一般來說,本書中的算法應該非常小心地“復制”或者從1開始的數組。
編輯:有關注釋算法的信息本書中的算法將最后一個元素作為透視。 因此,對於已排序的數組,它將成為一種可怕的算法。 它將以O(n ^ 2)結尾,所以沒有人應該在生產中使用這個算法(除非你知道你在做什么以及你的輸入是什么),因為數組往往有些排序。 Java的內置算法更聰明,您可以在Javadoc中閱讀它
在java中提供一個更多的實現。 它也基於相同的算法,並且也處理數組中的重復元素。
public void sort( int[] inputArray, int lo, int high){
int pivotIndex = partition(inputArray,lo,high);
System. out .println("Got PivotIndex as " + pivotIndex);
if (lo < pivotIndex -1)
sort(inputArray,lo,pivotIndex - 1);
if (pivotIndex+1 < high)
sort(inputArray,pivotIndex+1,high);
return ;
}
private int partition( int[] inputArray, int leftPtr,int rightPtr)
{
printArray(inputArray);
int pivot = inputArray[leftPtr];
while (leftPtr<rightPtr){
while (inputArray[leftPtr]<pivot)
leftPtr++;
while (inputArray[rightPtr]>pivot)
rightPtr--;
if (leftPtr<rightPtr)
{
exchange(inputArray,leftPtr,rightPtr);
//Cases which have repeated numbers...
if (inputArray[leftPtr] == inputArray[rightPtr])
leftPtr++;
}
}
return leftPtr;//return any one
}
如果你想要一些關於如何實現快速排序的參考,你可以嘗試在jdk中檢查Arrays.sort(*)的實際源代碼,這是快速排序的修改版本。 ( http://www.oracle.com/technetwork/java/javase/downloads/index.html下載,如果你的jdk安裝中還沒有src.zip)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.