Js 排序演算法 插入排序和希爾排序

2021-08-26 12:22:13 字數 1456 閱讀 6952

企業招聘筆試和面試的時候很喜歡問到排序演算法,時間複雜度,空間複雜度,穩定性,巴拉巴拉。說到排序演算法,那可是大一時候剛接觸c 語言(得有四五年了吧,有點暴露年齡,哈哈哈)學到的東西了,中間一直也沒有用過,基本上不記得多少了。所以特意花了一天多的時間來回顧一下排序演算法,這一篇就先說下插入排序和希爾排序,算是乙個學習過程的記錄。之所以把這兩種排序放在一起說,是因為兩者本質上是一樣的,都是插入排序,不過希爾排序相對於插入排序有所優化罷了,而且**看來可能更難理解一點。呼應題目,**都是用js 寫的。

演算法思想:插入排序的思想很容易理解,保證左邊有序,然後將右邊的資料依次插入左邊有序的資料中生成新的有序資料,如此迴圈,直至全部資料有序。

時間複雜度:最好情況下(資料正序)時間複雜度為

空間複雜度:因為是在陣列自身進行資料移動,只借助乙個額外的變數存放資料,所以空間複雜度為

穩定性:穩定

**實現:

var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];

function insertsort(arr)

arr[j + 1] = temp;

} return arr;

}console.log(insertsort(arr));

演算法思想:設定乙個初始gap,對增量為gap 的資料進行插入排序,然後縮減gap 進行插入排序,直至gap 大小為1(純插入排序)。來自:

時間複雜度:最好情況下(資料正序)時間複雜度為

空間複雜度:同插入排序,空間複雜度為

穩定性:不穩定

**實現:

var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];

function shellsort(arr)

arr[j + gap] = temp;

}} return arr;

}console.log(shellsort(arr));

從希爾排序的演算法思想中可以看到當gap 縮減為1 的時候實際上就變成了單步插入排序,那直接使用單步插入排序就得了,幹嘛前面還要費那麼多功夫,多做幾次不同gap 的插入排序。原因如下:

(1)插入排序找到位置後,該位置後面的有序元素要做移位,這些是對記憶體做操作,比較耗時。所以預先將序列分割,這樣移位的時候一次可以移動多格,預先讓元素處以比較正確的位置,讓最後一次排序時移位次數減少。

排序演算法 插入排序 希爾排序

1 相鄰資料之間相比較。先是1,0 然後2,1 1,0 以此類推 總結 大for從1 n 小for從i 0,之後判斷交換即可 public void charusort for int i 1 i a.length i 2 希爾排序是插入排序特殊化,他不再比相鄰資料,而是可以比較類似1,4,13.的...

插入排序演算法 希爾排序

插入排序演算法 希爾排序 希爾排序思想是將陣列每次分成不同的陣列同時進行排序,劃分的方式是設定增量值,即h length 2,h 2 與直接排序最大的不同就是比較的陣列值下標間隔不同。希爾排序在資料量龐大的時候進行排序效率高,時間短。觀察下圖,根據以上思想,進行移動。如下 include void ...

插入排序和希爾排序

插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,插入排序的基本思想是 每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。public static void sortins...