學習筆記 快速排序

2021-10-21 17:59:21 字數 1696 閱讀 8698

將乙個一維陣列從小到大排列。

快速排序利用了遞迴的思想。需要三個引數,陣列本身,陣列起始索引也就是0,陣列最右索引,也就是陣列長度-1。

簡單來說,快速排序的思想是這樣的,先選擇乙個數作為基準數,把比它小的都移動到左邊,把比它大的都移動到右邊,然後針對左邊這個子陣列,再選擇乙個基準數,比它小的移到左邊,比它大的移到右邊,重複以上,直到子陣列只剩1個數,這時候認為是有序的,返回到第一次,對右邊子陣列做同樣的操作。

具體來說。用left記錄陣列最左邊的索引,用right記錄陣列最右邊的索引(同樣也指子陣列最左和最右,第一次的時候就是0和長度-1)。基準數每次都選最左邊的數,也就是arr[left]。接著交錯進行大小判斷,因為基準數選的最左,所以要從最右開始判斷,如果最右的數(arr[right])大於等於基準數(合適,加上等於的情況防止死迴圈,比如左右基準三數相等,就會左右反覆交換死迴圈),就直接把索引right- -;如果最右的數小於基準數(不合適),就把他移到左邊空位也就是arr[left](基準數保留,所以這個位置相當於空了;緊接著判斷最左(arr[left]),如果最左的數小於等於基準數(合適),就直接把索引left++;如果最左的數大於基準數(不合適),就把他移到右邊空位也就是arr[right](此時原來的arr[right]被移到到了左邊所以這個位置就空出來了)。這樣下去,當left==right時,兩邊就判斷完了,此時把基準數放到中間(也就是left或者right,此時這裡是空位)。接下來,進行左子陣列,也就是開始遞迴呼叫自己,傳入的陣列起始索引還是0,但陣列最右索引變成了right-1(因為此時基準數在right=left處,那左子陣列最右就是right-1),然後開始右子陣列,同理陣列最右索引還是陣列長度-1,陣列起始索引就變成left+1。而迴圈退出的條件就是陣列或子陣列的長度為1,也就是傳入的陣列起始索引大於等於陣列最右索引(倆索引相等時肯定只有乙個數,大於是因為left+1,right-1這種操作可能會使left大於right,比如排完後基準數在最左,三個數都等於0,加減後,left就大於right了)

/**

* 採用遞迴的思想

* @param arr 陣列和陣列的左右子陣列

* @param l 陣列的最左邊和左右子陣列的最左邊

* @param r 陣列的最右邊和左右子陣列的最右邊

*/private

static

void

quicksort

(int

arr,

int l,

int r)

int left=l;

int right=r;

int pivot=arr[left]

;//基準數

//因為right,left隨時在變,所以每次操作都要判斷大小

while

(left

if(left

while

(left

<=pivot)

if(left

>pivot)

}//左右排完後把基準數放中間

if(left==right)

//排左邊

quicksort

(arr,l,right-1)

;//排右邊

quicksort

(arr,left+

1,r)

;}

快速排序學習筆記

學習資料出處 白話經典演算法系列之六 快速排序 快速搞定 快速排序採用分治策略,其基本思想 1 從數列中選乙個元素x作為基準數 2 分割槽過程,把不小於x的元素放到x的右邊,小於x的元素放到x的左邊 3 再對左右區間重複進行分割槽操作,直到各區間只有乙個數 morewindows總結的 挖坑填數 分...

學習筆記 快速排序

基本步驟 1 確定分界點x a l a r a l r 1 2 劃分區間 小於x的在一邊,大於x的在另一邊 3 遞迴處理左右兩端 const int n 1e5 5 int n,a n void quick sort int a,int l,int r quick sort a,l,j quick ...

快速排序學習筆記

一些廢話 今天在刷題的時候遇到了一道要求比較複雜的排序的題,用sort不能實現,需要手打快排。做完後來我的部落格翻了一下竟然沒寫過快排的隨筆,現在把它填上。大家都知道,在c 中,有乙個非常好用的函式sort 使用它只需要包括的標頭檔案即可。但是在某些情況下,僅僅使用sort 函式並不能充分滿足我們的...