插入排序是歸并排序的基礎(chǔ),插入排序的模型可以類比打牌的時候,將牌插入到合適的位置這一過程,這個過程很自然。

說實在,學(xué)算法這么長的時間,對這些自然的過程反而很難用語言表述清楚,話不多說,代碼如下:
def insert_sort(L):
i = 0
while i < len(L) - 1:
j = i+1
key = L[j]
while j >= 1 and L[j-1] > key:
L[j] = L[j-1]
j -= 1
L[j] = key
i += 1
return L
上述的代碼是精簡后的代碼,對于我來說,這個代碼雖然精簡,但是有很多的步驟是合并的,導(dǎo)致這種代碼我很少能在第一個版本里寫出來(所謂的第一個版本就是按照自己的思路,白板寫出來的代碼),換句話說,這種精簡的代碼,對我來說是不自然的,我無法直接感知他的存在,閱讀的時候,也不一定能夠直接反應(yīng)出這是插入排序,下面的代碼通常是我的第一反應(yīng),代碼如下:
def insert_sort(L):
i = 0
while True:
if i >= len(L) - 1:
break
j = i+1
key = L[j]
while True:
if j <= 0:
break
if L[j-1] <= key:
break
L[j] = L[j-1]
j -= 1
L[j] = key
i += 1
return L
是不是覺得有點奇怪,這兩段代碼是等價的,你只要對某些語句做個等價的變化就很容易的得到另外一套代碼,之所以會這樣,是因為我個人并不是編碼的高手,我的第一反應(yīng)是,我只能思考一步的動作,我很難將多個步驟合并成一步,當然,當我完成第一版本的時候,我可以通過重構(gòu)來實現(xiàn)精簡的版本。這時候你會問這兩個版本那個版本才是更好的,通常意義上說,精簡的版本是最好的,因為精簡的版本把很多繁瑣的步驟合并了,你可以通過讀一句就能很好的明白代碼在干什么,但是,我還是那句話,我不是編碼的高手,對于我來說第二個版本才是我的第一反應(yīng),我能做的是,在完成第二個版本之后,通過重構(gòu)的手段,精簡成第一個版本。
每個人對編碼的認識都是不同的,我相信,通過個人的這種編碼習慣,你總可以找到一個適合自己的編碼方式,而這種方式往往不具有通用性,它只適合你自己,因為每個人認識世界的方式都不一樣,可能你我的方式比較low,但是那是我們能做的最好的程度。
之前,有人和我說多都源碼,讀源碼你就能成為編碼的高手,我一直問自己是不是真的!我的答案是,讀源碼是有好處的,不過更多的還是需要自己獨立的思考,你要經(jīng)常問自己,如果是我來做設(shè)計,我會怎么做?而不是簡簡單單的認為別人寫的源碼就是足夠好的,因為,對于個人,我們的接受程度都是不同的,業(yè)務(wù)源碼真的足夠好,但是不一定適合你,因為那是別人認識世界的方式,對于你自己,你應(yīng)該也有一套認識世界的方式,別人的方式或許比較通用,你的比較獨特,不要否定自己的世界觀,只能,適度的讓他適應(yīng)這個所謂的通用的世界觀。
以后,我寫的代碼都是我的第一反應(yīng),因為我知道,這種方式是適合自己的,精簡代碼,只是另一種認識世界的方式。
另外,補充一點,我一直再說的是編碼方式,而不是算法,對于特定的算法,其核心思想是一致的,也就是說,編碼方式只是算法的顯示表現(xiàn)方式,換句話說,如果算法的核心思想是有問題的,不論你采用何種編碼方式,你的代碼都是有問題的,算法和編碼需要分開,算法的學(xué)習重要的是思想的體現(xiàn),編碼側(cè)重的是實現(xiàn)的方面,這兩個能力對于一個合格的程序員同等的重要?。。?/p>