以下是高德納在他的著作《計算機程序設計藝術》里對算法的特征歸納:
輸入:一個算法必須有零個或以上輸入量厕氨。
輸出:一個算法應有一個或以上輸出量,輸出量是算法計算的結果介评。
明確性:算法的描述必須無歧義朋贬,以保證算法的實際執(zhí)行結果是精確地匹配要求或期望铣揉,通常要求實際運行結果是確定的。
有限性:依據(jù)圖靈的定義蛾魄,一個算法是能夠被任何圖靈完備系統(tǒng)模擬的一串運算虑瀑,而圖靈機只有有限個狀態(tài)、有限個輸入符號和有限個轉(zhuǎn)移函數(shù)(指令)滴须。而一些定義更規(guī)定算法必須在有限個步驟內(nèi)完成任務舌狗。
有效性:又稱可行性。能夠?qū)崿F(xiàn)扔水,算法中描述的操作都是可以通過已經(jīng)實現(xiàn)的基本運算執(zhí)行有限次來實現(xiàn)痛侍。
1.什么是排序算法(Sorting algorithm)
一種能將一串數(shù)據(jù)依照特定排序方式進行排列的一種算法。
常用的排序方式是數(shù)值順序和字典排序魔市。
排序算法的輸出必須遵守下列兩個原則:
1.輸出結果為遞增序列恋日。(遞增是針對所需的排序順序而言)
2.輸出結果是原輸入的一種排列膀篮、或是重組。
2.常見排序算法 - 冒泡排序:體育委員兩兩摸頭法 (Bubble Sort)
冒泡排序是一種簡單的排序算法岂膳。它重復地走訪過要排序的數(shù)列誓竿,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來谈截。走訪數(shù)列的工作是重復地進行直到?jīng)]有再需要交換筷屡,也就是說該數(shù)列已經(jīng)排序完成。這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端簸喂。
冒泡排序算法的流程如下:
1.比較相鄰的元素毙死。如果第一個比第二個大,就交換他們兩個喻鳄。
2.對每一對相鄰元素作同樣的工作扼倘,從開始第一對到結尾的最后一對。在這一點除呵,最后的元素應該會是最大的數(shù)再菊。
3.針對所有的元素重復以上的步驟,除了最后一個颜曾。
4.持續(xù)每次對越來越少的元素重復上面的步驟纠拔,直到?jīng)]有任何一對數(shù)字需要比較。
3.插入排序 :起撲克牌法(Insertion Sort)
設有一組關鍵字{K1泛豪, K2稠诲,…, Kn}诡曙;排序開始就認為 K1 是一個有序序列臀叙;讓 K2 插入上述表長為 1 的有序序列,使之成為一個表長為 2 的有序序列价卤;然后讓 K3 插入上述表長為 2 的有序序列劝萤,使之成為一個表長為 3 的有序序列;依次類推荠雕,最后讓 Kn 插入上述表長為 n-1 的有序序列稳其,得一個表長為 n 的有序序列。
具體算法描述如下:
1.從第一個元素開始炸卑,該元素可以認為已經(jīng)被排序
2.取出下一個元素既鞠,在已經(jīng)排序的元素序列中從后向前掃描
3.如果該元素(已排序)大于新元素,將該元素移到下一位置
4.重復步驟 3盖文,直到找到已排序的元素小于或者等于新元素的位置
5.將新元素插入到該位置后
6.重復步驟 2~5
如果比較操作的代價比交換操作大的話嘱蛋,可以采用二分查找法來減少比較操作的數(shù)目。該算法可以認為是插入排序的一個變種,稱為二分查找排序洒敏。
二分查找法龄恋,是一種在有序數(shù)組中查找某一特定元素的搜索算法。搜素過程從數(shù)組的中間元素開始凶伙,如果中間元素正好是要查找的元素郭毕,則搜素過程結束;如果某一特定元素大于或者小于中間元素函荣,則在數(shù)組大于或小于中間元素的那一半中查找显押,而且跟開始一樣從中間元素開始比較。如果在某一步驟數(shù)組為空傻挂,則代表找不到乘碑。這種搜索算法每一次比較都使搜索范圍縮小一半。
4.桶排序:強迫癥收撲克牌法 (Bucket Sort)
也叫箱排序金拒,原理是將數(shù)組分到有限數(shù)量的桶子里兽肤,然后對每個桶子再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續(xù)使用桶排序進行排序),最后將各個桶中的數(shù)據(jù)有序的合并起來绪抛。
排序過程:
1.假設待排序的一組數(shù)統(tǒng)一的分布在一個范圍中资铡,并將這一范圍劃分成幾個子范圍,也就是桶
2.將待排序的一組數(shù)睦疫,分檔規(guī)入這些子桶害驹,并將桶中的數(shù)據(jù)進行排序
3.將各個桶中的數(shù)據(jù)有序的合并起來
Data Structure Visualizations 提供了一個桶排序的分步動畫演示
桶可多可少鞭呕,要么要速度要么要內(nèi)存
5.選擇排序:體育老師一指禪法(Selection sort)
選擇排序(Selection Sort)是一種簡單直觀的排序算法蛤育。它的工作原理如下,首先在未排序序列中找到最泻伞(大)元素瓦糕,存放到排序序列的起始位置,然后腋么,再從剩余未排序元素中繼續(xù)尋找最泄韭Α(大)元素,然后放到已排序序列的末尾珊擂。以此類推圣勒,直到所有元素均排序完畢。
選擇排序的主要優(yōu)點與數(shù)據(jù)移動有關摧扇。如果某個元素位于正確的最終位置上圣贸,則它不會被移動。選擇排序每次交換一對元素扛稽,它們當中至少有一個將被移到其最終位置上吁峻,因此對n個元素的序列進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序?qū)儆诜浅:玫囊环N用含。
圖像演示
6.計數(shù)排序
無法統(tǒng)計負數(shù)和小數(shù)矮慕,但是他比快排還要快,需要一個hash啄骇,計數(shù)排序?qū)τ跀?shù)據(jù)范圍很大的數(shù)組痴鳄,需要大量時間和內(nèi)存,適用性不高缸夹。
7.基數(shù)排序
固定10個桶夏跷,從0~9,依次從個位進行排序明未,之后百位槽华,以此類推,排的次數(shù)與最大數(shù)的位數(shù)相同趟妥。
體育委員兩兩摸頭法(冒泡排序)
體育老師一指禪法(選擇排序)
起撲克牌法(插入排序)
強迫癥收撲克牌法(基數(shù)排序)
快排
歸并排序
堆排序