從哪裡開始呢?最經典的演算法是排序吧?

第一篇,從哪裡開始呢?

最經典的演算法問題,應該是排序吧?

排序,就是給你了下面這一堆長長短短的棍子,讓你按照從小到大(或者從大到小也行)的順序,把它們排整齊。

加上顏色,純屬為了耍酷好看,沒有特別的意義。這裡只看長短,不看顏色。

這東西太常用,以至於:1)每個學計算機軟體的人都學過;2)已經研究了無數種排序方法,大概是被研究得最透徹的基礎演算法了。

就是因為太基礎了,也沒必要詳細說每種排序怎麼做,就做幾個動圖,弄來好玩吧:

一、冒泡排序

冒泡排序(Bubble Sort),逐個訪問要排序的列表,一次比較兩個元素,如果它們的順序錯誤就把他們交換過來,直到沒有再需要交換,也就是說該數列已經排序完成。

這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端,像是氣泡冒上去一樣。

這個雖然看起來好看,可是不太好用啊!太慢了!

二、冒泡排序的優化

其實上面的動圖可以看出來,整個列表已經都有序了之後,還有幾次循環。這種情況下最後幾次循環是沒有意義的。那麼可以進行一點優化:設置一個變數,標誌是否還有交換。如果某次循環裡面就已經沒有交換了,那麼就可以停止了。

三、漣漪排序/雞尾酒排序

其實,冒泡排序是朝著一個方向冒泡。為什麼不能雙向呢?把最大的冒到最右邊,把最小的降到最左邊。就像是水面的漣漪,蕩來蕩去,全靠浪:

四、選擇排序

每一次從待排序的列表中選出最大的一個元素,存放在列表的最右邊,直到全部排完。

簡單地說,每次找出最高的,讓他站到隊伍最後去。

五、選擇排序的優化

既然每次都要從列表中選個最高的去最後,那為什麼不能也把最矮的站到最前面呢?這樣就可以一輪選兩個了。看下面的動圖,就是從兩邊向中間,逐步有序。

六、插入排序

插入排序,顧名思義,就是把一個新來的元素,插入到一個已經排好順序的列表裡面就好了。

可是哪裡來的排好順序的列表呢?很簡單啊,把一個列表掰成兩截,第一個元素作為第一個列表,這樣第一個列表就是已經排好序的了,因為只有1個元素嗎。然後把後面的那個列表裡的元素,一個一個地插入到第一個列表裡就好了。這樣第一個列表就是完整的排好序的,第二個列表就空了。

看動圖:


推薦閱讀:

試問和直接選擇排序比起來,簡單選擇排序的意義何在?
為什麼在平均情況下快速排序比堆排序要優秀?
哪種排序演算法最美?
c語言關於快速排序?
這次,我給知乎點 32 個「贊同」——淺析知乎新的回答排序演算法

TAG:算法 | WolframMathematica | 排序算法 |