funcmerge(a []int, b []int)[]int{// 新建一个长度控制的空列表var r =make([]int,len(a)+len(b))var i =0var j =0for i <len(a)&& j <len(b){if a[i]<= b[j]{
r[i+j]= a[i]
i++}else{
r[i+j]= b[j]
j++}}for i <len(a){
r[i+j]= a[i]
i++}for j <len(b){
r[i+j]= b[j]
j++}return r
}funcMergesort(items []int)[]int{iflen(items)<2{return items
}// 将列表从中间分成两部分var middle =len(items)/2// 使用递归的思想来解决各自内部的排序var a =Mergesort(items[:middle])var b =Mergesort(items[middle:])// 调用merge函数returnmerge(a, b)}
Heap 堆排序
//利用堆这种数据结构 子结点的键值或索引总是小于(或者大于)它的父节点package sorts
//结构体 可以为不同项定义不同的数据类型type MaxHeap struct{
slice []int
heapSize int}funcBuildMaxHeap(slice []int) MaxHeap {
h := MaxHeap{slice: slice, heapSize:len(slice)}for i :=len(slice)/2; i >=0; i--{
h.MaxHeapify(i)}return h
}func(h MaxHeap)MaxHeapify(i int){
l, r :=2*i+1,2*i+2
max := i
if l < h.size()&& h.slice[l]> h.slice[max]{
max = l
}if r < h.size()&& h.slice[r]> h.slice[max]{
max = r
}if max != i {
h.slice[i], h.slice[max]= h.slice[max], h.slice[i]
h.MaxHeapify(max)}}func(h MaxHeap)size()int{return h.heapSize }// ???funcheapSort(slice []int)[]int{
h :=BuildMaxHeap(slice)for i :=len(h.slice)-1; i >=1; i--{
h.slice[0], h.slice[i]= h.slice[i], h.slice[0]
h.heapSize--
h.MaxHeapify(0)}return h.slice
}
Shell 希尔排序
funcshellSort(arr []int)[]int{// d 为中间值 当d > 0时会d /= 2for d :=int(len(arr)/2); d >0; d /=2{// 从 d 开始进行循环 len(arr) - d 次for i := d; i <len(arr); i++{// j := ifor j := i; j >= d && arr[j-d]> arr[j]; j -= d {// 元素开始交换
arr[j], arr[j-d]= arr[j-d], arr[j]}}}return arr
}