快速排序演算法的JAVA實現

2021-05-21 17:37:25 字數 2302 閱讀 6359

package utils.sort;

/**

*快速排序,要求待排序的陣列必須實現comparable介面

public class quicksort implements sortstrategy

private static final int cutoff = 3;             //當元素數大於此值時採用快速排序

/**

*利用快速排序演算法對陣列obj進行排序,要求待排序的陣列必須實現了comparable介面

public void sort(comparable obj)

if (obj == null)

throw new nullpointerexception("the argument can not be null!");

quicksort(obj, 0, obj.length - 1);

/**

*對陣列obj快速排序

*@param obj 待排序的陣列

*@param left 陣列的下界

*@param right 陣列的上界

private void quicksort(comparable obj, int left, int right)

if (left + cutoff > right)

sortstrategy ss = new choosesort();

ss.sort(obj);

else

//找出樞軸點,並將它放在陣列最後面的位置

pivot(obj, left, right);

int i = left, j = right - 1;

comparable tmp = null;

while (true)

//將i, j分別移到大於/小於樞紐值的位置

//因為陣列的第乙個和倒數第二個元素分別小於和大於樞紐元,所以不會發生陣列越界

while (obj[++i].compareto(obj[right - 1]) < 0)    {}

while (obj[--j].compareto(obj[right - 1]) > 0)      {}

//交換

if (i < j)

tmp = obj[i];

obj[i] = obj[j];

obj[j] = tmp;

else

break;

//將樞紐值與i指向的值交換

tmp = obj[i];

obj[i] = obj[right - 1];

obj[right - 1] = tmp;

//對樞紐值左側和右側陣列繼續進行快速排序

quicksort(obj, left, i - 1);

quicksort(obj, i + 1, right);

/**

*在陣列obj中選取樞紐元,選取方法為取陣列第乙個、中間乙個、最後乙個元素中中間的乙個。將樞紐元置於倒數第二個位置,三個中最大的放在陣列最後乙個位置,最小的放在第乙個位置

*@param obj 要選擇樞紐元的陣列

*@param left 陣列的下界

*@param right 陣列的上界

private void pivot(comparable obj, int left, int right)

int center = (left + right) / 2;

comparable tmp = null;

if (obj[left].compareto(obj[center]) > 0)

tmp = obj[left];

obj[left] = obj[center];

obj[center] = tmp;

if (obj[left].compareto(obj[right]) > 0)

tmp = obj[left];

obj[left] = obj[right];

obj[right] = tmp;

if (obj[center].compareto(obj[right]) > 0)

tmp = obj[center];

obj[center] = obj[right];

obj[center] = tmp;

//將樞紐元置於陣列的倒數第二個

tmp = obj[center];

obj[center] = obj[right - 1];

obj[right - 1] = tmp;

排序演算法 快速排序的Java實現

所謂快速排序 基於分治的思想,是氣泡排序的改進型。首先在陣列中選擇乙個基準點並把基準點放於序列的開頭 該基準點的選取可能影響快速排序的效率,關於基準點的選擇方法後面再講解 然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌 lo指向起始位置,hi指向末尾 首先從後半部分開始,如果發現有元素比該基準點的值小...

排序演算法 快速排序 java實現

它採用了一種分治的策略,通常稱為分治法。分治法思想 將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。對於陣列a,隨機選擇乙個元素作為基準數pos,一般為第乙個元素或最後乙個元素。將該陣列分為兩堆a 0,pos index 1 和 a ...

Java實現快速排序演算法

一 演算法描述 快速排序是對氣泡排序的一種改進。在氣泡排序中,記錄每次都是與相鄰位置上的資料作比較,因此每次只能移動乙個位置。而在快速排序中,記錄的比較和移動都是從兩端向中間進行的。其主要思想 首先在待排序陣列中選取乙個基準值 作為比較物件 然後利用基準值將待排陣列分成2個部分。基準值左邊的陣列的資...