十大經典演算法總結
一、思想:分治,遞迴
序位,前後位置——下標
元素的值:關鍵字,數字的大小
快速排序,效率很高。
圖示說明
(和具體操作一起看,那裡的一些結論直接畫在圖上了)
二、具體操作
(一)思路
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個元素的兩個子串行。解決 使用歸併排序遞迴地排序兩個子串行。合...