github.com/benz9527/toy-box/algo@v0.0.0-20240221120937-66c0c6bd5abd/sort/shell.go (about) 1 package sort 2 3 /* 4 基本思想 5 假设待排序的 N 个对象,首先选取一个整数作为 gap(< N),将全部对象分为 gap 个子序列, 6 所有距离为 gap 的对象放在同一个子序列里面,接着在每一个子序列中实施插入排序,然后逐步缩小 gap 的值, 7 并重复排序的过程,直到 gap == 1 且完成排序 8 9 这是一种不稳定排序,也就是不能保证相同元素之间原有的先后顺序 10 排序的性能取决于 gap 的数学性质(公式) 11 12 shell's original sequence: n/2, n/4, ..., 1 13 14 Knuth's increments: 1, 4, 13, ..., (3^k - 1) / 2 15 http://sun.aei.polsl.pl/~mciura/publikacje/shellsort.pdf 16 17 Sedgewick's increments: 1, 8, 23, 77, 281, 1073, 4193, 16577, ..., 18 Hibbard's increments: 1, 3, 7, 15, 31, 63, 127, 255, 511, ... 19 Paperno & Stasevich increments: 1, 3, 5, 9, 17, 33, 65, ... 20 Pratt: 1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81, ... 21 */ 22 23 /* 24 ShellSort 25 从 internal 不断地往 index 0 进行交换才能确保所有元素的有序性 26 如果是从 index 0 不断往后遍历会出现部分元素无序现象 27 */ 28 func ShellSort(arr []int) { 29 n := len(arr) 30 for interval := n / 2; interval > 0; interval = interval / 2 { 31 for i := interval; i < n; i++ { 32 temp := arr[i] 33 j := i 34 for ; j >= interval && arr[j-interval] > temp; j = j - interval { 35 arr[j] = arr[j-interval] 36 } 37 arr[j] = temp 38 } 39 } 40 }