取陣列最中間的那個數為基數(取哪乙個數為基數都可以,取中間的只是為了好理解),在左邊找乙個比基數大的數,在右邊找乙個比基數小的數,如果找到就交換兩個數的位置,交換過後再向下尋找,直到左邊的角標大於等於右邊則退出,一輪排序後,基數的左邊一定都是比基數小的,基數的右邊一定是比基數大的,(注意:基數不一定還在原來的位置,可能出現在基數左邊找不到比基數大的數,故而左邊找到的數只能是基數本身,而右邊找到的數小於基數,此時,仍會發生交換,交換過後,右邊的數就是基數本身,然後左邊的角標+1,再比較左邊的數是否大於基數,大於就交換,以此迴圈),然後遞迴基數左邊的所有元素(角標從left — r)結束後遞迴基數右邊所有元素(角標 l — right)
public
static
void
quicksort
(int
arr,
int left,
int right)
while
(arr[r]
> pivot)
if(l >= r)
temp = arr[l]
; arr[l]
= arr[r]
; arr[r]
= temp;
if(arr[l]
== pivot)
if(arr[r]
== pivot)}if
(l == r)
if(left < r)
if(right > l)
}
效率更高的一種快排
public
static
void
quicksort2
(int
arr,
int left,
int right)
}private
static
intpartition
(int
arr,
int left,
int right)
arr[left]
=arr[right]
;while
(left<=key)
arr[right]
=arr[left];}
arr[left]
=key;
return left;
}
排序演算法(五) 快速排序
在陣列中選取乙個數作為基準值,進行乙個partition過程,將小於該數的放在左邊,大於的放在右邊,等於的放在中間,再對左右分別進行該操作。時間複雜度 每次partition可以將乙個數字位置確定,將陣列劃分為兩部分,因此想要有序,理想情況每次剛好兩邊大小一樣,則一共需要logn次partition...
排序演算法(五) 快速排序
快速排序是一種效率很高的排序演算法,也是我們使用最多的一種排序演算法。快速排序原理 兩個指標分別指向陣列兩頭元素,將陣列第乙個元素儲存下來,作為基準數,兩個指標開始向中間移動,先移動陣列尾部指標,直到發現所指元素比基準數小時,將這時候所指向的數賦值給陣列頭部指標指向的位置,然後尾部指標停止移動,頭部...
排序演算法總結(五)快速排序
快速排序的思想是選取待排陣列中的乙個數作為中間數 一般是第乙個數 然後將陣列中數與這個中間數進行比較,使中間數左邊的數都小於中間數,中間數右邊的數都大於中間數,這樣中間數就在正確的位置上,然後將左右兩部分再次進行相同的操作,最終會得到乙個有序的陣列。快速排序的演算法平均時間複雜度為o nlogn 最...