最容易理解的排序算法

排序不難,但是有時候我們容易出錯,容易混淆等等,我們慢慢來分析,從最簡單的開始慢慢深入理解。

插入排序

直接插入排序:每一步將一個待排的記錄根據關鍵字的大小插入已經排好序的那部分裏邊去,直到所有的都插完爲止。

我們來看例子來分析:

初始大小:57 68 59 52

1、第一個數是57,就一個數,所以就默認排好了,然後就把68插進來,發現68>57,就直接插在57後面,不需要任何的處理;得到: 57 68。

2、第三個數是59,我們發現了57<59<68,所以59就插在57之後,得到: 57 59 68。

3、最後一個數是52,我們對比發現52<57,插在57之前,就完成了插入的排序。

也許有同學發現了,這麼簡單的排序,我一眼就能看的出結果,確實,很簡單,但是我們是爲了強調這個排序算法。

 希爾排序:是在直接插入排序的基礎上進行改進的一個排序算法,所以也叫插入排序。基本思想就是每次都是按照確定的間隔將元素分組,在每一組中進行直接插入排序,使得小的元素可以跳躍式的前進,然後逐步的將步長縮小,直到步長爲1,然後等到這個序列基本有序之後,那麼我們就可以進行直接插入排序了。

其實不難,我們來看個例題就一目瞭然了:

1、我們看一下就明白,首先我們要折半,然後是每隔5個一組,進行組合,然後兩兩對比,我們只需要調整兩個數即可;

2、然後再折半後取奇數得3,我們就從28開始,每隔三個一組進行分類,這樣我們只需要對比三組數。

3、我們最後在原來的基礎上折半取奇數得1,然後我們就開始最後一次的排序,得到我們的結果。


選擇排序:

簡單選擇排序:這個也不難理解,我們先來看一個例子,就輕而易舉了:


既然是選擇排序,那麼還是需要一點點的選擇和對比的,我們來分析一下這個步驟:

1、首先我們要對比找到最小的元素,與第一個交換。

2、繼續找繼第一個之後最小的,與第二個交換。於此類推,我們就能完成簡單選擇排序。

我們接下來講一下堆排序,比較有意思的選擇排序;

堆排序:

一句話很通俗的一句話來概括:a.孩子結點都要大於父結點(小頂堆);b.孩子結點都小於父結點(大頂堆)。

然後我們再來理解堆排序就容易了:

K<=K2i且K1<=K2i+1或者K1>=K2i且K1>=k2i+1

接下來我們看一個圖,用圖來分析比較形象具體:


我們可以看的出來,這是個小頂堆,因爲孩子結點都要比父結點要大。很簡單吧。

要是讓我們對一個數列進行以下排序,建立一個大頂堆,我們應該怎麼做呢?我們來看看:

對數列{46,79,56,38,40,84}建立大頂堆,步驟應該是:

1、按照這個順序來建立一個完全二叉樹,

按照順序來一一對應來填補,然後我們就得到了:


我們發現7號葉子結點咱們沒有,所以就省了。

2.我們首先看n/2個結點是3號結點,就是56,它比其子節點84小,所以應該84和56位置對調,得:


得到:


3、我們看n/2-1個結點,就是2號結點,值爲79,我們馬上能觀察的出來,他比兩個子節點都要大,所以不用調。

4、我們繼續看n/2-2個結點,就是1號結點,他比兩個子節點都小,所以把它和較大的子節點84對調:


得:

5.我們一眼就看的出來,經過調整的結點46<56所以我們先把他們對調了,得:


這樣就基本符合咱們的題目要求了。

但是我們需要的是有序的序列,所以我們還得繼續:

a.我們首先要處理頂,因爲他的值最大,我們把他和編號最大的,6號結點值爲46的對調,對調完成之後,我們還得把指針斷開,如:


我們就有了最大的元素了84了,然後我們發現對調完的頂是46,還有一個比他大得多的79,所以我們得把他們兩換了,得:


接下來我們還是同樣的方法,把79和編號最大的40對調,得到:


然後我們又把40和56對調,然後再把剩下的對調,結果就出來了:


排序沒有想象中的那麼複雜,動手來分析一下就好多了。

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