之前的兩篇中,為大家介紹了霍爾劃分和挖坑法劃分,這一篇,我們來看看第三種劃分方法——前後指標法。
顧名思義,需要兩個指標,乙個在前乙個在後,分別用cur表示前指標,prev表示後指標(這裡的指標的意思是待排序數列的下標),依舊是這個圖,初始時,我們規定cur在prev的後乙個位置,這裡我們還是選擇第乙個數為基準值,如下圖
箭頭指向的為基準值,prev指向這個數列開始的第乙個,cur指向prev的後乙個位置,此時我們便將它初始化完成。那麼現在需要怎麼操作呢?
我們規定,prev每次都需要指向從左到它本身之間最後乙個小於基準值的數,如果cur的值大於基準值,這時只讓cur++,如果cur指向的位置小於基準值,這時我們讓prev++後,判斷是否與cur的位置相等,若不相等,則交換cur和prev的值。直到cur>end後,我們再交換prev和基準值,這樣基準值的位置也就確定了。
現在我們一步步**
此時初始化後我們發現,cur指向的值小於基準值,我們讓prev++,發現prev和cur相等,這時再讓cur++,開始下次的判斷,如下圖
這時cur明顯大於基準值,所以我們繼續讓cur++,而prev保持不動,得到下圖
這時我們cur的值小於基準值,我們讓prev++,此時prev指向32,我們發現prev不等於cur了,這時我們交換prev和cur的值,如下圖
交換後,繼續讓cur向後走,此時發現cur的值為60,大於基準值,於是prev保持不懂,使cur繼續向後走,走到2的位置時,發現其小於基準值,我們讓prev++,發現prev為32不等於cur,我們繼續交換prev和cur的值,如下圖
繼續讓cur向後走,此時cur為5,小於基準值,我們讓prev++,發現prev為60不等於cur,所以我們繼續交換prev和cur的值,如下圖
繼續讓cur向後走,此時cur為72,大於基準值,prev繼續保持不動,讓cur再向後走,發現此刻cur已經大於end,所以,這時我們交換prev和基準值,如下圖
到這,我們的一趟快速排序就結束了,此時28的位置已經確定,我們依舊是遞迴呼叫此劃分,直到該數列成為乙個有序數列
同樣我們要使兩個數交換,所以繼續寫乙個交換函式(寫的不能再熟練了)
void
swap
(int
*a array,
int left,
int right)
**如下
int
partion
(int
* array,
int begin,
int end)
//待排序陣列的首指標,待排序的首尾元素下標
//當跳出迴圈時,說明prev及之前的值都是小於基準值的數,則交換prev指向的值和基準值
swap
(array,prev,begin)
;return prev;
//返回此時基準值的下標,便於下次遞迴呼叫時分組
}
同樣,需要寫乙個遞迴函式來呼叫此種劃分方法,與之前兩篇寫的一樣,如下
void
quicksort
(int
* array,
int begin,
int end)
排序 快速排序(前後指標法)
時間複雜度 最壞 o n 2 不會出現 最好 o nlogn 平均 o nlogn 空間複雜度 o logn 函式呼叫棧,極端情況 o n 不會出現 穩定性 不穩定 資料敏感 敏感 include 公升序 void swap int array,int i,int j 三數取中 這麼做是為了防止資料...
快速排序演算法 挖坑法 左右指標法 快慢指標法)
挖坑法,可以理解成拆東牆補西牆。這裡以陣列 4,1,7,6,9,2,8,0,3,5 為例子講解。以資料第乙個元素作為樞軸 也可以是最後乙個,看你喜好 這裡我們先把作為樞軸的4摳出來單獨放置,此時陣列變成了 口,1,7,6,9,2,8,0,3,5 這時我們要從陣列尾部開始往前找,找第乙個比4小的數字,...
快排之前後指標法 酷雲快速排序演算法v1 0 0
前後指標法 1.根據前後大小判斷陣列是否返回 2.取節點,初始節點為start,變更節點為start 3.如果初始節點比目標值大,初始節點 4.如果初始節點比目標值小,變更節點與初始節點交換,變更節點 初始節點 5.交換初始節點與目標值 public class quicksort system.o...