基礎篇--插入排序

不用google,直接百度,就會找到很多的關於基礎排序算法的博文和帖子。我也猶豫,是否需要自己重新寫一下關於幾種基礎排序的博文。或是直接轉載幾篇。可是最後還是決定自己重新寫一下幾篇比較基礎的算法知識。因爲這裏面蘊藏的不僅僅是一種方法,更多的是一種思想,一種很直觀的思想。

基礎的排序算法,也是最早被提出的幾種算法,最先誕生的肯定也是最簡單、最直觀的。是很多人都能想到的。可是在這些理論背後的一些實踐,卻又是不近相同的。我在這裏不會做太多的引申,只是闡述一下我對這些算法的理解。並儘可能的做出一些代碼性的東西。

基礎篇的幾篇博文,也會着重討論一下排序的幾種方法。具體的,我也沒想好有多少,就是寫到哪兒算哪兒吧。

提到算法,很多人都會認爲是高大上的東西,很多人都會覺得這個東西離我們很遙遠。甚至這輩子唯一能接觸到的算法就是在電影裏看到那些牛掰的科學家說通過一個什麼算法做了什麼事情。例如:電影復仇者聯盟裏班納博士寫個算法,找到大老黑的蹤跡。

其實,算法離我們很近,近的你都沒有在乎過他的存在。例如:當你走在路上,看到一個賣水果的,你稱了三個蘋果,稱完老闆說六塊錢,這個時候,你發現錢包裏沒有六塊錢的零錢,你會怎麼做,如果你夠懶,就拿個十塊的讓他找四塊。可是如果你討厭零錢(很多時候會這樣,零錢佔地方),你會先看一下,錢包裏比6元大的最小的面值的鈔票是多大,如果你發現是10元。肯定會選10元的,可是你這個時候討厭零錢,你就會在你的錢包裏繼續尋找,是否有1元,這樣的話,水果攤的老闆直接找你5元整的鈔票就好了。其實,這就是一個算法,並且難度不亞於插入排序。

如果你覺得這是個例,那我們就再舉一個例子。坐公交車出行,相信每個人都有這個經歷。從你家到公司,肯定有多種選擇。多條道路。在交通發達的今天,這個是很正常的。可你每天上班的路,幾乎是固定的,爲什麼。這就是你用自己的公交線路算法計算出來的最優值。你肯定會考慮下面的幾點:

首先考慮路程,從家到公司,有多少種方式。然後選擇其中最短的幾條。

其次會考慮車頻率的問題,如果兩種方案具有相同的站數,但是其中一種方案的公交車一分鐘一趟,另外一種半小時一趟。你肯定也會有一個選擇。

另外還考慮路上的擁堵情況。如果一種方案需要的站數最少,可是有一段路每天要擁堵1小時,你肯定也不會選他。

其實,這個路線選擇算法,要比插入算法複雜很多。要考慮的方面也很多。可是幾乎八十歲的老太太都能熟練的應用。只不過沒有給它起個比較霸氣的名字而已。

如果讓你說從家到公司的路線選擇,你會脫口而出。可是如果讓你用“城市交通路線最優算法”計算從你家到公司的路線,你可能就搞不懂了。其實,只是變了個名字而已。

廢話說了一堆,我們開始真正的從最基礎的算法開始,學習算法。今天我們首先介紹的,是插入算法。

稍微學過一點計算機知識的,對排序算法並不陌生,如果你在大學學過c語言(亦或是其他任何語言),你都會練習過插入算法的書寫。如果你大學裏沒有學過計算機語言,你參加過計算機等級考試。那你肯定也練習過插入算法。只不過,你可能當時都不知道這個東西叫插入算法。可能也沒有理會過這種算法,甚至都沒有覺得這是一種算法。下面我們就說一下這個算法,假設下面的數組是已經排序一部分的數組。

有六個數字需要排序,前面的四個已經排列好了,繼續排列第五個。第五個要先和第四個數比較,如果比第四個數字小,那就繼續和第三個數字進行比較,知道找到小於等於待排序元素的位置,然後將已成型的數組的後半部分進行移動,爲插入的數據提供一個位置。這樣知道該數字到達他正確的排序位置。這種排序方法,簡單來說,就是將需要排序的數字,插入到他合適的位置,所以這種方法叫插入排序。

插入排序的特點是簡單,很簡單,就像我們鬥地主的時候,將撲克牌排序一樣,很利於我們直接的理解。

這種排序算法的時間複雜度,要依賴於被排序數列的狀態有比較大的依賴性。如果數列是拍好續的,那這種排序算法的時間複雜度是線性的,而如果數列是倒序的,那麼時間複雜度將會以二次冪的形式增長。但總體來說,這種排序方法屬於一種萬金油型排序方法,在排序界,混的很臉熟。

好了,今天嘮叨一下自己的看法,並簡單介紹一下插入排序。到這裏吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章