希爾排序是按照不同步長對元素進行分組插入排序的,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個數很少,速度很快;當元素基本有序了,步長很小,插入排序對於有序的序列效率很高。所以,希爾排序的時間複雜度會優於o(n^2)
具體實現**如下,先看一種複雜一點的,但是便於理解的實現
for(int increment=a.length;increment>0;increment/=2)
a[k+increment]=temp;}}
}}
上述**總共有4層迴圈組成,最外層迴圈由增量控制,第二層迴圈,
控制分組插入排序的次數,例如第一次增量為5,故分成5個組,第二層迴圈需執行5次,第一次a1a2,第二次b1b2,…..第五次e1e2,最裡面的2層迴圈則為插入排序。
第二次增量為2,則對a1a2a3a4a5,b1b2b3b4b5,進行分組排序
。上面的**有點繁瑣了,但是符合常規人的思維。我們再看來看下面一種優化版的。
for(int increment=a.length;increment>0;increment/=2)
a[k+increment]=temp;}}
}
去掉了原來的第二層迴圈,最裡面的變數j的初始值由原來的i+increment變為了increment,j每次增加由increment變為了+1,
就拿增量為2的時候來說吧,
第一組為a1a2a3a4a5
第二組為b1b2b3b4b5
第一種方法,是先拿a2和a1比,再拿a3和a2,a1比
等到第一組比完了才到第二組,
而第二種方法是,是先拿a2和a1比,再拿b1和b2比,而後在拿a3,和a2,a1比,2組交替進行排序,但是並不影響最後的結果。
深入理解快速排序
快速排序分為兩部分 2,快排函式本身,通過遞迴呼叫自身,每次呼叫可以使乙個元素回歸正確的位置,並使該元素之前的元素都小於該元素,之後的元素都大於該元素 遞迴的退出條件是base top 這樣,我們可以最後把整個數列割到最小兩個元素的子列,再使子列有序,從而整個數列都有序。值得注意的是,快排不會使某個...
mysql order by排序深入理解
mysql 排序篇 mysql 排序,如果從比較深入的角度來討論這個命題,這一節完全可以出一本書。在這裡我們只做簡單介紹。mysql排序,這個動作會出現在兩個兩個地方,乙個是記憶體,另乙個是磁碟檔案。由關鍵字order by 驅動。具體的排序條件根據結果集的字段決定。1 mysql 排序的演算法 m...
深入理解氣泡排序
氣泡排序可能非你所想。氣泡排序的思路 給定乙個陣列,每次迴圈出最大的數依次向後排,並將較小的數向前冒。平均時間複雜度 o n 2 最好情況 o n 已經排好序 最壞情況 o n 2 倒敘的時候 空間複雜度 o 1 沒有占用額外的空間 穩定性 穩定 排序前相等的兩個數,排序後位置不變 氣泡排序值得注意...