Day2 分治法 快速排序

2021-09-27 13:49:11 字數 1808 閱讀 9780

十大經典演算法總結

一、思想:分治,遞迴

序位,前後位置——下標

元素的值:關鍵字,數字的大小

快速排序,效率很高。

圖示說明

(和具體操作一起看,那裡的一些結論直接畫在圖上了)

二、具體操作

(一)思路

basic,分割後的陣列左右邊界lr(下標),動的標記i,j(下標)

(二)思考

建立分割的這個函式,這個需要在遞迴中多次用到的函式,可以說他是乙個分割函式,一次分割,通常說他是一次「快排」,有人將他命名為quik_sort()

形參表我們要找這個函式裡面的變數,形參表需要傳遞的數

1)想一想:每一次遞迴需要更新的部分?

每一次都只對分割後的陣列進行再次分割,其實需要傳遞新的左右邊界

2)再想一想新的邊界是什麼?

分割後的左邊部分,需要更新右邊界。

分割後的右邊部分,需要更新左邊界。

它們其實都在上次分割的分割點(i=j)處,新的右邊界是分割點-1,左邊界是分割點。

(三)**

問題**:

#include

using namespace std;

void

quick_sort

(int q,

int l,

int r)

//完成一次基本分割

quick_sort

(q,l,j-1)

;//左半邊再分割

/*一直執行這句到不了下一句為啥??????? */

quick_sort

(q,j,r)

;//右半邊再分割

}int

main()

void

swap

(int a,

int b)

改正後**,依然有問題。

#include

using namespace std;

void

quick_sort

(int q,

int l,

int r)

//完成一次基本分割

if(l

quick_sort

(q,l,j-1)

;//左半邊再分割

/*解決方案:增加左邊界比有邊界小這個條件 */

if(j

quick_sort

(q,j,r)

;//右半邊再分割

/*依然有問題:進行到這裡r值不是整體邊界了,左邊分割時將j-1不斷傳給r改變了r值了,現在的r值是左半邊的有邊界了,但是這裡需要的是整體的右邊界

怎麼解決?快排學不會了 */

}int

main()

void

swap

(int a,

int b)

提供的模板方法**

void

quick_sort

(int q,

int l,

int r)

quick_sort

(q, l, j)

,quick_sort

(q, j +

1, r);}

277/

快速排序 day 2

問題 給定乙個長度為n的整數數列,以及乙個整數k。請用快速選擇演算法求出數列的第k小的數是多少。輸入格式 第一行包含兩個整數 n 和 k。第二行包含 n 個整數 所有整數均在1 1000000範圍內 表示整數數列。輸出格式 輸出乙個整數,表示數列的第k小數。資料範圍 1 n 1000000,1 k ...

演算法筆記(三) 分治法(快速排序)

參考了網上大神的理解後,自己也嘗試著寫下傳說中的 快速排序 大致思路總結為 挖坑填坑 分治法。舉個例子 我們對陣列a 9 進行分析。首先我們拿陣列中的隨機乙個數作為基準數 參照物件,也就是要挖的坑 把基準數變成坑 用 x 來表示 然後我們把它和陣列的第乙個數字置交 比如我們拿到的基準數為5,那麼新陣...

2 3 1 分治法 歸併排序

分治法模式 分解原問題為若干子問題,這些子問題是原問題的規模較小的例項。解決這些子問題,遞迴地求解各子問題。然而,若子問題的規模足夠小,則直接求解。合併這些子問題的解成原問題的解。對於歸併排序 分解 分解待排序的n個元素的序列成各具n 2個元素的兩個子串行。解決 使用歸併排序遞迴地排序兩個子串行。合...