經典算法--Python實現


排序技術

插入排序
基本思想:每次從數列中取出一個未取出的數,按照大小關系插入到已取出的數中,使已取出的數依然有序
在這里插入圖片描述

插入排序代碼

希爾排序
基本思想:先將一個長序列分割為幾個短序列進行插入排序,將原始序列排成基本有序的順序再進行插入排序。
在這里插入圖片描述

希爾排序代碼

冒泡排序
基本思想:核心是交換,對相鄰倆個數據進行比較,如果逆序則交換,數次交換后,小的會到隊頭,大的會到隊尾
在這里插入圖片描述

冒泡排序代碼

快速排序
基本思想:使用分治策略把一個序列分成倆個子序列,其中一部分的記錄比另一部分小,隨后再對這倆部分分別再分成倆部分,使一部分的所有記錄比另一部分小,如此反復
在這里插入圖片描述

快速排序代碼

簡單選擇排序
基本思想:每一趟都在所有記錄中選取最小的記錄放入有序數列中,如此反復就能將無序序列有序化
在這里插入圖片描述

選擇排序代碼

堆排序
基本思想:利用堆的數據結構設計的算法,堆的定義:一顆完全二叉樹所有結點(除了葉子結點)的值都小於其左右孩子結點的值,則這棵完全二叉樹就被稱為堆。
每次將堆的頂點輸出,再調整剩余數據使其重新排成一個堆。重復這個過程就能得到一個有序數列
在這里插入圖片描述

堆排序代碼

歸並排序
基本思想:非常典型的分治法采用。先將單個序列視為有序序列,然后不斷將相鄰的倆個有序序列合並得到新的序列,如此反復最終得到一個有序序列
在這里插入圖片描述

歸並排序代碼

桶排序
基本思想:基於空間換時間的排序方法。桶排序假設數據服從均勻分布,然后將排序序列划分成若干區間,一個區間看成一個桶,再通過一個映射函數將序列中的記錄映射到桶中,再對每個桶中的記錄進行排序,然后按序輸出
在這里插入圖片描述

桶排序代碼

基數排序
基本思想:通過關鍵字排序對單邏輯記錄進行排序的方法。舉個例子,對一副打亂的牌,如何使其再次有序?首先按照牌面的不同記錄分成13堆,如何所有同記錄的堆到一起,再按順序疊放
在這里插入圖片描述

基數排序代碼

索引與查找技術

二叉排序樹
二叉排序樹,也稱二叉查找樹,它是一顆空樹或者是具有下列性質的二叉樹:
(1)若左子樹不為空,則左子樹上所有結點的值均不小於它的根結點的值
(2)若右子樹不為空,則右子樹上所有結點的值均不大於它的根結點的值
(3)左右子樹也分別為二叉排序樹
基本思想:在隨機遇到一個數據時可以很快的進行插入,並保持二叉樹中序遍歷有序的狀態,這個特質使其非常使用於動態索引
一顆二叉排序樹:
一顆二叉查找樹

二叉排序樹代碼實現

線性表的查找技術
1.順序查找
基本思想:從線性表的一端到另一端將關鍵字與給定的查找值逐個進行比較。若查找成功則返回記錄在數據表中的位置;若未找到關鍵字,則查找失敗,返回查找失敗信息

順序查找代碼

2.折半查找
類似二分查找,將待比較的key值與第mid=(low+high)/2位置的元素進行比較

折半查找代碼

內插查找
基本思想:根據數學上的內插法,當知道關鍵字K位於K1和Kh之間時將下一次查找的位置選在
(K - K1) / (Kh - K1)這一比例點上

折半查找代碼

字典樹
專門用於字符串查找而設計的一種排序樹。字典樹具有以下三個基本性質:
(1)根結點不包含字符,除根結點外每一個結點都只包含一個字符
(2)從根結點到某一結點,將路徑上的字符連接起來,為該結點對應的字符串
(3)每個結點的所有子結點包含的字符都不相同

字典樹實現代碼

散列表
散列表,也稱哈希表。根據關鍵碼值而直接訪問的數據結構,它通過把關鍵碼值映射到表中一個位置來訪問記錄,加快查找的速度。這個映射函數也叫做散列函數
記錄的存儲位置=f(關鍵字)
哈希表hashtable(key,value) 就是把Key通過一個固定的算法函數既所謂的哈希函數轉換成一個整型數字,然后就將該數字對數組長度進行取余,取余結果就當作數組的下標,將value存儲在以該數字為下標的數組空間里。(或者:把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。)
而當使用哈希表進行查詢的時候,就是再次使用哈希函數將key轉換為對應的數組下標,並定位到該空間獲取value,如此一來,就可以充分利用到數組的定位性能進行數據定位。

哈希表實現

經典算法

遞歸
遞歸的基本思想是把規模大的問題轉化為規模小的相似子問題來解決。在函數實現時,因為解決大的問題和解決小的問題的方法往往是同一方法,所以就產生了函數調用它自己的情況。另外,解決問題的函數必須要有遞歸邊界,也就是遞歸結束的條件,否則將無限遞歸下去

遞歸實現整數n的階乘
遞歸算法解決漢諾塔問題

迭代
迭代利用計算機運算速度快,適合做重復性操作這一特點,讓計算機對一組指令進行重復執行。使用迭代要做好以下三個方面的操作:
(1)確定迭代變量
在可以用迭代解決的問題中,至少存在一個直接或間接的、不斷有舊值遞推出新值的變量
(2)建立迭代關系式
即如何從變量的前一個值退出其下一個值的公式,可以用遞推或者倒推的方法來完成
(3)對迭代過程進行控制
要考慮什么時候結束迭代過程

迭代實現斐波那契數列

貪心算法
貪心算法在對問題求解時不從整體最優上考慮,所做的僅是在某種意義上的局部最優解。貪心算法沒有固定的算法框架,其算法設計的關鍵是貪心策略的選擇。選擇的貪心策略必須具備無后效性,即某個狀態之后的過程不會影響之前的狀態,只與當前狀態有關。
要注意貪心算法的適用條件與前提:最優子結構和貪心選擇性質
最優子結構:當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。
貪心選擇性質:指所求問題的整體最優解可以通過一系列局部最優的選擇,即貪心選擇來達到,即每一步的最優解可以帶來問題的整體最優解
貪心選擇性質是貪心算法與動態規划的主要區別,與動態規划相比,雖然貪心算法和動態規划都具有最優子結構性質,但動態規划通常自底向上的方式解決問題,而貪心算法通常一自頂向下的方式進行求解

貪心算法經典問題--活動安排問題

參考文章:

一文搞定十大經典排序算法
圖解基數排序
圖解桶排序
哈希表(散列表)詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM