做個通俗描述這兩個排序的筆記,文縐縐的我真記不住…起碼要我寫**的時候我做不到那麼文縐縐…這只是就個人理解易於記憶,要專業解釋的可以搜一下大神的描述~
就從大到小排序舉例,插入排序就是我在已經排好序的隊伍裡(這個隊伍一開始是0的)跟最後乙個比較,我如果比他大我就**隊,一直往前插,直到前乙個是比我大的,那就打不過不走了,坐下來乖乖排好。希爾排序就加了個步長的概念,乙個個插入太麻煩了,有十個人要排隊那步長就是10/2=5,我就在隊伍最後往前挑,每隔五個我就比較插隊。步長5的都排好了,那步長繼續折半,這時候是2,每隔兩個比較排隊,最後步長為1,也就等同於插入排序了,但經過之前的步長,現在有序程度已經很高了,效率會比單純用插入排序高。
插入排序:
public
class
paixucharu
int cout =0;
for(
int i =
0; i < len; i++
) system.out.
println()
;}else}}
}}
輸入data大小:10
輸入10個整數:78 65 39 74 82 61 84 73 49 72
i=0、1、2的時候隊伍都沒有變化,這裡就i=3那部分舉例:data[3]起身來往前排序,這時候值為74,跟data[2]的39比較,小東西,**隊!然後一直走到data[1]的位置,前面是78,慫了,確定就data[1]位置坐下。
希爾排序:
public
class
paixuxier
int buchang = len;
while
(buchang >=1)
system.out.
println()
;}else}}
}}}}
輸入data大小:10
輸入10個整數:78 65 39 74 82 61 84 73 49 72
譬如步長是2的時候,經過之前步長=5的排序,現在的排序是78 84 73 74 82 61 65 39 49 72。因為要跨兩步嘛,78、84跨就越界了,所以73開始,73跨兩步跟78比,鬥不過,原地坐下(從步長變成2之後到這裡,佇列的排序是沒變化過的)。然後到82加入戰鬥,一腳就把比它小的73踢到data[4]的位置,走到data[2](這個而體現在78 84 82 74 73 61 65 39 49 72這行,這也是步長=2後佇列的第一次變化),此時82還不甘心,因為前面還有個data[0]是78比它小的,於是它坐到了data[0]的位置:
插入排序 希爾插入排序
本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...
插入排序 希爾排序
我們知道當乙個序列基本有序時,直接插入會變得很高效。因為此時只需少量的移動元素,操作集中在元素的比較上。基於這種想法,我們就試圖把乙個序列在進行直接插入前調整得盡量有序。這就是希爾排序 shell sort 的核心思路。shell只是演算法發明者的名字,無特殊含義 那到底該怎麼做呢?希爾排序一反以前...
插入排序 希爾排序
希爾排序 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。以n 10的乙個陣列49,38,65,97,26,13,27,49,55,4為例 第一次 gap 10 2 5 4938 6597 2613 2749554 ...