插入排序java_插入排序與希爾排序Java版
阿新 • • 發佈:2020-12-15
技術標籤:插入排序java
插入排序
時間複雜度:O(n²)
插入排序(Insertion Sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用 in-place 排序(即只需用到 O(1) 的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。——維基百科
public void sort(int[] data) { int tmp; int j; for (int p = 1; p < data.length; p++) { tmp = data[p]; for (j = p; j > 0 && data[j - 1] > tmp; j--) { data[j] = data[j - 1]; } data[j] = tmp; } }
希爾排序
原始的演算法實現在最壞的情況下需要進行 O(n2) 的比較和交換。優化後效能提升至 O(n log2 n)。這比最好的比較演算法的 O(n log n) 要差一些。
該演算法是衝破二次時間屏障的第一批演算法之一。
希爾排序有時也叫做縮小增量排序(diminishing increment sort)。
希爾排序使用一個序列 h1,h2,h3,...ht,叫做增量序列(increment sequence),只要 h1 = 1,任何增量序列都是可行的。
public void sort(int[] array) { int number = array.length / 2; int i; int j; int temp; while (number >= 1) { for (i = number; i < array.length; i++) { temp = array[i]; j = i - number; while (j >= 0 && array[j] > temp) { array[j + number] = array[j]; j = j - number; } array[j + number] = temp; } number = number / 2; } }
使用不同的增量序列時間複雜度也都各不相同。
如果覺得還不錯的話,歡迎關注我的公眾號,我會不定期發一些乾貨~
也可以加我微信: