一、前言
資料結構與演算法,順便刷leetcode,無意間發現了乙個 我覺得講解的比較好的網頁,並且會拿leetcode裡面的題目當做例題,如有需要,奉上**:五分鐘學演算法
二、演算法的介紹
選取兩個哨兵i,j哨兵i指向序列的最前端,哨兵j指向序列的最後端,選取乙個基準點。
判斷哨兵i指向的元素是否大於基準點?若小於,則哨兵i後移一位,若大於,則哨兵i動。
判斷哨兵j指向的元素是否大於基準點?若大於,則哨兵j前移一位,若小於於,則哨兵i動。
交換哨兵i,哨兵j指向的兩個元素,然後重複上訴操作,直至i,j相遇。此時基準點左邊的元素全部小於基準點,右邊的元素全部大於基準點。
更換基準點,在原來基準點的左邊和右邊在此重複1-4的操作,直至所有元素全部排列完畢。
三、演算法的圖示(**於網路)
圖一
圖二
圖三
四、**
#include
using
namespace std;
void
quicksort
(int
* dps,
int low,
int high)
dps[i]
=tmp;
quicksort
(dps,low,i-1)
;重複上述操作
quicksort
(dps,i+
1,high);}
intmain()
五、演算法的性質穩定性:相同元素的相對位置可能發生改變,故該演算法不穩定。
空間複雜度:快速排序使用的空間是o(1)的;而真正消耗空間的就是遞迴呼叫,每一趟排序都將元素序列均勻地分割成長度相近的兩個子表,所需棧的最大深度為log2(n+1);但最壞的情況下,棧的最大深度為n。這樣,快速排序的空間複雜度為o(log2n))。
時間複雜度:每次劃分所選擇的中間數恰好將當前序列幾乎等分,經過log2n趟劃分,便可得到長度為1的子表。這樣,整個演算法的時間複雜度為o(nlog2n),最壞的情況為o(n2);
十大排序演算法之快速排序
簡單排序 插入排序 選擇排序 氣泡排序 必學 分治排序 快速排序 歸併排序 必學 分配排序 桶排序 基數排序 樹狀排序 堆排序 必學 其他 計數排序 必學 希爾排序 原理 核心思想是通過乙個支點進行資料拆分,左邊的資料小於這個支點,右邊的資料大於支點,然後把左邊和右邊的做一次遞迴,直到遞迴結束。ph...
十大排序演算法 快速排序
原理 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽 partition 操作 遞迴地 recursive 把小於基準值元素的子...
十大排序演算法之 快速排序 六)
選取基準點,左右指標分別從左右進行選取進行交換,使左邊資料小於等於基準點,右邊資料大於基準點,返回基準點,進行遞迴。private static void quicksort int arr,int left,int right 分割槽 int mid partition arr,left,righ...