演算法章節 遞迴 排序 分查詢

2021-10-17 08:46:30 字數 3153 閱讀 7627

概念與特性

函式調⽤函式⾃身的程式設計⽅式叫做遞迴,調⽤為」遞「,返回為」歸「

三個條件

1. ⼀個問題的解可以分解為多個⼦問題的解;

2. 分解之後的⼦問題,除了資料規模不同,求解思路跟原問題相同;

3. 存在遞迴終⽌條件;

程式設計技巧

1. 尋找將⼤問題分解為⼩問題求解的規律;

2. 找出遞推公式和終⽌條件,將其直接翻譯成**;

3. 切記不要⼈⾁⼀層⼀層的遞迴;

換句話說,也就是:如果⼀個問題a可以分解為若⼲⼦問題b、c、d,我們可以假設⼦問題b、c、d已經解決,在此基礎上思考如何解決問題a。

我們只需要思考問題a與⼦問題b、c、d兩層之間的關係即可,不需要⼀層⼀層往下思考⼦問題與⼦⼦問題,⼦⼦問題與⼦⼦⼦問題之間的關係。

應⽤場景

遞迴是⼀種應⽤⾮常⼴泛程式設計技巧,很多資料結構和演算法的編碼實現都要

⽤到遞迴,⽐如快排、歸併排序、dfs(深度優先搜尋演算法)、⼆叉樹遍歷、回溯等;

其他知識點

1. 避免堆疊溢位(限制調⽤層次;遞迴改為迭代;尾遞迴優化);

2. 避免重複計算(利⽤備忘錄);

掌握程度

1. 熟練編寫斐波那契數列、全排列、⼋皇后、快速排序;歸併排序、dfs、⼆叉樹遍歷、鍊錶反轉遞迴實現等;

2. 掌握遞迴演算法的時間、空間複雜度分析;其中時間複雜度通過遞推公式或者遞迴樹來分析;空間複雜度跟遞迴函式調⽤棧深度成正⽐; 

概念與特性

1. 穩定性:如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變;

2. 原地:不額外申請⾮常量級的空間來臨時儲存排序資料;原地排序演算法並不⼀定空間複雜度是o(1),空間複雜度是o(1)的排序演算法⼀定是原地排序演算法,⽐如快速排序是原地排序演算法,但因為⽤到遞迴,函式調⽤棧會消耗⾮常量級的空間,所以,空間複雜度並⾮o(1),是o(logn)。

o(n^2)

氣泡排序

氣泡排序是穩定原地排序演算法。 整個氣泡排序過程包含多遍冒泡操作。每次冒泡操作都會遍歷整個陣列,依次對相鄰的元素進⾏⽐較,看是否滿⾜⼤⼩關係要求,如果不滿⾜,就將它們互換位置。⼀次冒泡操作會讓⾄少⼀個元素移動到它應該在的位置,重複n次,就完成了n個資料的 排序⼯作。

插⼊排序

插⼊排序是穩定原地排序演算法。⾸先,我們將陣列中的資料分為兩個區間,已排序區間和未排序區間。初始已排序區間只有⼀個元素,就是陣列中的第⼀個元素。插⼊演算法的核⼼思想是取未排序區間中的元素,在已排序區間中找到合適的插⼊位置將其插⼊,並保證已排序區間資料⼀直有序。重複這個過程,直到未排序區間中元素為空,演算法結束。

選擇排序

選擇排序演算法是⾮穩定原地排序演算法。其實現思路有點類似插⼊排序,也分已排序區間和未排序區間。

但不同點在於,選擇排序演算法每次會從未排序區間中,找到最⼩

的元素,將其放到已排序區間的末尾。

o(nlogn)

快速排序

快速排序是⾮穩定原地排序演算法。空間複雜度是o(logn)。 如果要排序陣列中下標從p到r之間的⼀組資料,我們選擇p到r之 間的任意⼀個資料作為pivot(分割槽點),然後,遍歷p到r之間 的資料,將⼩於pivot的放到左邊,將⼤於pivot的放到右邊,將 pivot放到中間。經過這⼀步驟之後,p到r之間的資料就被分成 了三個部分。假設pivot現在所在位置的下標是q,那p到q-1之 間資料都⼩於pivot,中間是pivot,q+1到r之間的資料都⼤於 pivot。根據分治、遞迴的處理思想,我們遞迴排序下標從p到 q-1之間的資料和下標從q+1到r之間的資料,直到區間縮⼩為 1,就說明所有的資料都有序了。

遞推公式:quicksort(p…r)=quicksort(p…q-1) & quicksort(q+1…r)

歸併排序

歸併排序是穩定⾮原地排序演算法。空間複雜度是o(n)。 如果要排序⼀個陣列,我們先把陣列從中間分成前後兩部分,然後,對前後兩部分分別排序,再將排好序的兩部分合併在⼀起,這樣整個陣列就都有序了。遞推公式:mergesort(p…r)=merge(mergesort(p…q), mergesort(q+1… r))

o(n)

桶排序桶排序,顧名思義,會⽤到「桶」,核⼼思想是將要排序的資料分到⼏個有序的桶⾥,每個桶⾥的資料再單獨進⾏排序。桶內排完序之後,再把每個桶⾥的資料按照順序依次取出,組成的序列就是有序的了。要排序的資料需要很容易就能劃分成m個桶,並且,桶與桶之間 有著天然的⼤⼩順序。這樣每個桶內的資料都排完序之後,桶與桶之間的資料不需要再進⾏排序。

計數排序

實際上,計數排序是桶排序的⼀種特殊情況。當要排序的n個資料,所處的範圍並不⼤的時候,⽐如最⼤值是k,我們就可以把資料劃分成k個桶。每個桶內的資料值都是相同的,省掉了桶內排序的時間。

基數排序

基數排序對要排序的資料也是有要求的,需要可以分割出獨⽴的「位」來⽐較,⽽且位之間有遞進的關係:如果a資料的⾼位⽐ b資料⼤,那剩下的低位就不⽤⽐了。除此之外,每⼀位的數 據範圍不能太⼤,可以使⽤其他線性排序演算法來排序,否則,基數排序的時間複雜度就⽆法做到o(n)了。

應⽤場景

⼯程中的排序函式⼀般使⽤o(nlogn)的快排、歸併或者堆排序作為主排序算 法,當資料規模較⼩時,轉⽽選擇使⽤更加簡單的插⼊排序。

其他知識點

為了避免快速排序時間複雜度退化為極端情況o(n^2),我們使⽤更加⾼級的 分割槽點選擇⽅式,⽐如三數取中法、隨機法等。

掌握程度

1. 熟練掌握冒泡、插⼊、選擇、快速、歸併排序的原理、**實現;

2. 熟練掌握快速、歸併排序的時間和空間複雜度分析;

3. 掌握桶排序、計數排序、基數排序的原理

概念與特性

⼆分查詢針對的是⼀個有序的資料集合,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對⽐,將待查詢的區間縮⼩為之前的⼀半,直到找到要查詢的元素,或者區間被縮⼩為0。

操作與複雜度

⼆分查詢的時間複雜度是o(logn)

⼆分查詢變體

變體⼀:查詢第⼀個值等於給定值的元素

變體⼆:查詢最後⼀個值等於給定值的元素

變體三:查詢第⼀個⼤於等於給定值的元素

變體四:查詢最後⼀個⼩於等於給定值的元素

掌握程度

熟練掌握⼆分查詢、⼆分查詢變體的**實現

遞迴演算法 歸併排序,快速排序,二分查詢

待排序的陣列,演算法輸入 int arrintegers 10 輔助儲存空間 int tempintegers 10 從陣列中間劃分陣列為2個子陣列,遞迴呼叫歸併排序,然後合併 排序過程發生在合併時候 2個子陣列。輔助儲存空間為n。這裡使用的方式和 快速排序分析裡面有差別,這個是交換,那乙個是填坑 ...

二分查詢遞迴演算法

使用此演算法的前提是,要查詢的範圍為有序範圍。一組數 num 9 left mid right 步驟 1.left為最左端元素的下標,right為最右端元素的下標,mid為查詢區間的中間元素,key為要查詢的元素。2.當left right的時候,比較num mid 和key 1 num mid k...

二分查詢演算法(遞迴 非遞迴)

二分查詢 binary search 先來個比較官方的解釋 二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 對數搜尋 英語 logarithmic search 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如...