第一種方法:(從陣列右邊開始)
1.選擇乙個比較值c,以陣列的第乙個為例。
2.從右邊開始查詢比c小的值,再從左邊開始查詢比c大的值,進行互換。
3.當左邊和右邊同時指向乙個值v(比c小,因為是從右邊開始遞減的),會退出當前迴圈。
4.交換c和v的值,返回v所在的位址。
5.遞迴,以此類推
public
class
quicksort
return a;
}public
static
intpartition
(int
a,int left,
int right)
while
(a[i]
<=pivot&&i
if(i
}
a[left]
=a[j]
; a[j]
=pivot;
return j;
}public
static
void
main
(string[
] args)
;int
k=quicksort
(a,0
,a.length-1)
;for
(int i=
0;i}
第二種方法:(從陣列左邊開始數)
public
static
intpartition
(int
a,int left,
int right)
while
(a[j]
>=pivot&&i
if(i
}
a[right]
=a[i]
; a[i]
=pivot;
return i;
}
有同學可能就要問了,為什麼第一種方法陣列一定要從右邊開始呢。
while(arr[j]>=temp&&i=temp&&i
於是,j 也會停留在數字7 那個位置,於是問題來了。當你最後交換基數6與7時,不對呀!!。
問題在於當我們先從在邊開始時,那麼 i 所停留的那個位置肯定是大於基數6的,而在上述例子中,為了滿足 i
但最後交換回去的時候,7就到了左邊,不行,因為我們原本 交換後數字6在邊應該是全部小於6,右邊全部大於6.但現在不行了。
於是,我們必須從右邊開始,也就是從基數的對面開始。
第三種方法:(基於第一種,從左邊開始數的修正演算法)
排序演算法 快速排序 java實現
它採用了一種分治的策略,通常稱為分治法。分治法思想 將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。對於陣列a,隨機選擇乙個元素作為基準數pos,一般為第乙個元素或最後乙個元素。將該陣列分為兩堆a 0,pos index 1 和 a ...
Java實現快速排序演算法
一 演算法描述 快速排序是對氣泡排序的一種改進。在氣泡排序中,記錄每次都是與相鄰位置上的資料作比較,因此每次只能移動乙個位置。而在快速排序中,記錄的比較和移動都是從兩端向中間進行的。其主要思想 首先在待排序陣列中選取乙個基準值 作為比較物件 然後利用基準值將待排陣列分成2個部分。基準值左邊的陣列的資...
java實現快速排序演算法
快速排序是應用很廣泛的排序演算法。主要原因是它實現簡單 適用於各種不同的輸入資料且在一般應用中比其他排序演算法都要快得多。快速排序主要思想就是當兩個子陣列都有序時整個陣列也就自然有序了。而這個過程就是先選出乙個基準數,一般都選第乙個,然後基準數的左邊都是小於基準數的,基準數的右邊都是大於基準數的。然...