從頭開始,依次比較相鄰兩個元素的大小,若左側》右側,則將兩元素位置交換(公升序)。重複以上過程,至多進行n-1次遍歷即可完成整體的排序。
最好情況為公升序,無需移動;最壞情況為資料降序排列,每移動乙個元素需要一次遍歷,最後一次移動後最小自動到首位,故需要移動n-1次。
程式設計基本設想為雙層for迴圈。外層迴圈索引為迴圈序數,每完成一次迴圈,便確定乙個數的位置(將當前遍歷的陣列中最大值置於最後)。內層迴圈索引為元素位置,遍歷範圍為:0~[陣列總元素個數(n)-已確定元素個數(外層迴圈序數 j )-1 (最後一位無需移動)]
例:若有10個數,由於最後一次無需移動,則遍歷9次即可完成,那麼便是
for
(int j=
0;j1;j++
)
對於內層:
採用分組思想,依次對組內元素進行排序,最後對整體進行排序
首先設定間隔,事實上希爾排序對於分組的間隔沒有明確的界定,不過一般為資料總數的一半。如:10個整型資料,那麼便可以設定間隔為5,每組就分配到了兩個資料。將這5組進行組內排序。
接著,我們重新設定間隔,在原有間隔上減半,再次對組內的元素進行排序。
不斷地重複上述操作,直到最後的間隔為1。此時,我們進行最後一次整體的排序,得到最終結果。
!無論過程中設定的間隔為多少,最終希爾排序的間隔都會為1!
時間複雜度
最好最壞
平均穩定性
冒泡o(n)
o(n2)
o(n2)
穩定選擇
o(n)
o(n2)
o(n2)
不穩定插入
o(n)
o(n2)
o(n2)
穩定希爾
o(n)
o(n2)
o(n1.3)
不穩定快速
o(n*log2n)
o(n2)
o(n*log2n)
不穩定歸併
o(n*log2n)
o(n*log2n)
o(n*log2n)穩定堆
o(n*log2n)
o(n*log2n)
o(n*log2n)
不穩定基數
o(d(r+n))
o(d(r+n))
o(d(r+n))
穩定注:r為基數,d為長度,n為個數。
部分整理自網路。
常見排序演算法複雜度
相關概念 1 穩定排序 stable sort 和非穩定排序 穩定排序是指所有相等的數經過某種排序演算法操作後仍然能保持它們在排序之前的相對次序。反之就是非穩定排序。2 內排序 internal sorting 和外排序 external sorting 在排序過程中,所有需要排序的數都在記憶體,並...
排序演算法實現及複雜度分析 一
排序是計算機程式設計中的一種重要的操作,它的功能是將乙個資料元素 或記錄 的任意序列,重新排列成乙個按關鍵字有序的序列。由於待排序的記錄數量不同,使得排序過程中涉及的儲存器不同,可將排序方法分為兩大類 一類是內部排序,指的是待排序記錄存放在隨機儲存器中進行的排序過程 另一類是外部排序,指的是待排序記...
各種排序演算法時間複雜度及空間複雜度
平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 最好情況是加了改進方法的最好 即冒泡的過程中檢查是否發生了交換,如果沒有發生交換,說明都排好序了,就break 插入 平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 直接選擇排序 平均o n 2 最壞o ...