funcShellSort(arr []int) { n := len(arr) gap := n / 2 for gap > 0 { for i := gap; i < n; i++ { temp := arr[i] j := i for j >= gap && arr[j-gap] > temp { arr[j] = arr[j-gap] j -= gap } arr[j] = temp } gap /= 2 } }
时间复杂度:最好情况下为 O(nlogn),最坏情况下为 O(n^2)。
5 选择排序
对数据操作 n-1 轮,每轮找出一个最小(大)值。以此类推,直到所有元素均排序完毕。
1 2 3 4 5 6 7 8 9 10 11 12
funcSelectionSort(arr []int) { n := len(arr) for i := 0; i < n-1; i++ { minIdx := i for j := i+1; j < n; j++ { if arr[j] < arr[minIdx] { minIdx = j } } arr[i], arr[minIdx] = arr[minIdx], arr[i] } }
funcmerge(left, right []int) []int { result := make([]int, 0, len(left)+len(right)) i, j := 0, 0 for i < len(left) && j < len(right) { if left[i] <= right[j] { result = append(result, left[i]) i++ } else { result = append(result, right[j]) j++ } } result = append(result, left[i:]...) result = append(result, right[j:]...) return result }