快速排序學習筆記

2021-06-26 17:55:31 字數 1179 閱讀 9299

學習資料出處:

白話經典演算法系列之六 快速排序 快速搞定

快速排序採用分治策略,其基本思想:

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 函式並不能充分滿足我們的...