先來複習下找基準的方法:
public static int partion(int arr, int start, int
end)
if (start >= end) else
while (start
< end && arr[start] <= tmp)
if (start >= end) else
}arr[start] = tmp;
return start;
}
後面所有的優化程式都採用該方法來找基準。
聚集相同元素排序是快速排序的一種優化方案,它的思路是在經過一次找基準之後把資料中與基準相同的資料聚集到基準左右,這樣就可以少進行幾次遞迴找基準的過程,從而提高了執行效率。
看以下程式:
public
class
focusalikequicksort else }}
// 尋找並聚集基準右邊與基準相同的元素
for (int j = par + 1; j <= end; j++) else }}
// 以陣列的形式返回聚集相同元素之後的未有序資料的邊界
int array = new
int[2];
array[0] = parleft;
array[1] = parright;
return array;
}public
static
void
quicksort(int arr, int start, int end)
if (par < end - 1) }}
執行過程是這樣的:
隨機取基準法是快速排序的另一種優化方案,它是通過產生隨機數的方式在資料中隨機選取乙個資料來進行找基準操作,次方法較快排在效率上有一定的提高。
看程式:
public
class randomquicksort
public
static
void
quicksort(int arr, int start, int end)
if (par < end - 1) }}
此方法也是快速排序的一種優化方案,它的思路是比較資料中start,end以及兩者中間位置的資料的大小,將這三個值中處於中間位置的值放到首位,再進行找基準操作,此方法較之快排在效率上也有一定的提高。
看程式:
public
class
thirdpartitionquicksort
/** 比較結束後開始值,中間值和結尾值有序 */
public
static
void
selectpivotmedianofthree(int arr, int low, int high)
// 確定開始值小於結尾值
if (arr[low] > arr[high])
// 確定開始值大於中間值
if (arr[mid] > arr[low])
} public
static
void
quicksort(int arr, int start, int end)
if (par < end - 1) }}
以上三種方式以及上文末尾提到的優化方法往往結合使用,這樣優化後的效率才能有明顯的提高。 快排的幾種變形
快排的幾種方式與思想可以用到很多地方,直接看 view code 1 include 2 include 34 author mike feng 5 快排,時間複雜度為o nlgn 幾種方法的實驗,注意細節。6 1,兩邊分別訪問,交換 7 2,一邊訪問,交換 8 3,兩邊分別訪問,替換 9 4,隨機...
快排及優化
快速排序的本質就是選取乙個基準數,通過一次快排把基準數大的都放在基準數的左邊,把比基準數小的放在基準數的右邊,這樣就找到了基準數在陣列中的正確位置。然後可以用遞迴的方式分別對前半部分和後半部分排序,最終實現整體陣列有序。所謂排序的穩定性,就是指在排序過程中,在對某關鍵字排序後會不會改變其他關鍵字的順...
快排優化 1
include define max 100 儲存的最大值 void swap int a,int b int numberofthree int arr,int head,int end if arr head arr end if arr mid arr head 此時,arr mid arr ...