學習資料出處:
白話經典演算法系列之六 快速排序 快速搞定
快速排序採用分治策略,其基本思想:
1) 從數列中選乙個元素x作為基準數
2) 分割槽過程,把不小於x的元素放到x的右邊,小於x的元素放到x的左邊
3) 再對左右區間重複進行分割槽操作,直到各區間只有乙個數
morewindows總結的「挖坑填數+分治法」非常到位,其中挖坑填數將分割槽過程剖析的很透徹,一目了然。運用「挖坑填數」,將分割槽過程的步驟總結為以下4點:
1) i = left; j=right;將基準數x挖出形成第乙個坑a[i],x=a[i]
2) j--,從後往前找出大於或等於基準數x的數,找到後挖出並填入前乙個坑a[i]中,a[i] = a[j],此時形成新的坑a[j]
3) i++,從前往後找出不小於基準數x的數,找到後挖出並填入前乙個坑a[j]中,a[j] = a[i];此時形成新的坑a[i]
4) 重複執行步驟2)、3),直到i==j,然後將基準數填入a[i]中,a[i]=x
複雜度分析
挖坑填數的分割槽過程,會將區間[left, right]的元素輪詢一遍,其時間複雜度為o(n);基於分治法,遞迴呼叫次數為o(log(n)),因此快速排序總的時間複雜度為o(n*log(n))。
遞迴呼叫程式設計實現如下,若採用迭代實現呢?
#pragma once
/*@ 調整陣列a區間[l, r], 返回m.使得a[i] < a[m], l <= i < m; a[j] >= a[m], m < j <= r
@ 基於此得到的quicksort是公升序排列
@ 時間複雜度為o(n)
*/template
int adjustarray(t* a, int l, int r)
測試**:
#include
#include
#include "quicksort.h"
using namespace std;
/*@列印陣列
*/template
void displayarray(t a, size_t size)
{ for(size_t i=0; i
學習筆記 快速排序
基本步驟 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 ...
學習筆記 快速排序
將乙個一維陣列從小到大排列。快速排序利用了遞迴的思想。需要三個引數,陣列本身,陣列起始索引也就是0,陣列最右索引,也就是陣列長度 1。簡單來說,快速排序的思想是這樣的,先選擇乙個數作為基準數,把比它小的都移動到左邊,把比它大的都移動到右邊,然後針對左邊這個子陣列,再選擇乙個基準數,比它小的移到左邊,...
快速排序學習筆記
一些廢話 今天在刷題的時候遇到了一道要求比較複雜的排序的題,用sort不能實現,需要手打快排。做完後來我的部落格翻了一下竟然沒寫過快排的隨筆,現在把它填上。大家都知道,在c 中,有乙個非常好用的函式sort 使用它只需要包括的標頭檔案即可。但是在某些情況下,僅僅使用sort 函式並不能充分滿足我們的...