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  }