Go算法之希尔排序

一、什么是希尔排序

希尔排序有点像插入排序的升级版,它的主要就是,我们一开始先确定一个步长(某个长度),然后让 i(初始为0) 和 该步长位置的值比较大小,让 i 不断 ++,再用个变量为 i + 该步长。接着比较之后,缩短步长大小,最终排序到合理位置。

在Go语言中实现希尔排序,可以按照以下步骤进行:

  1. 选择增量序列:增量序列决定了元素之间的间隔。常见的增量序列有希尔增量(初始增量为数组长度的一半,之后每次减半,直到增量为1)、Hibbard增量(形如1, 3, 7, ...)、Sedgewick增量等。

  2. 分组排序:根据当前增量,将数据分成若干个子序列,每个子序列包含间隔为当前增量的元素。对每个子序列进行插入排序。

  3. 缩小增量:逐步缩小增量,并重复分组排序的过程,直到增量为1,此时整个数组就是一个子序列,对其进行最后一次插入排序。

二、代码实现

package sort

import (
	"log"
	"testing"
)

func TestShellSort(t *testing.T) {
	arr := []int{3, 2, 1, 1, -1, 0, 5}
	log.Println(arr)
	shellSort(arr)
	log.Println(arr)
}

func shellSort(arr []int) {
	length := len(arr)
	if length < 2 {
		return
	}
	gap := length / 2 // 步长
	for gap > 0 {
		// 对每个子序列进行插入排序
		for i := gap; i < length; i++ {
			temp := arr[i]
			j := i
			// 在子序列中向前扫描,如果前面的元素比当前元素大,则交换
			for ; j >= gap && arr[j-gap] > temp; j -= gap {
				arr[j] = arr[j-gap]
			}
			// 如果上面那个循环没有执行,其实这行代码就相当于不变
			// 有点类似 arr[i] = temp
			arr[j] = temp
		}
		gap /= 2 // 缩小增量
	}
}

你可能感兴趣的:(Go数据结构与算法小白入门,算法,golang,后端,排序算法)