Go语言排序算法实现

时间:2023-03-08 16:56:14
Go语言排序算法实现
// Algorithm project Algorithm.go
package Algorithm // 冒泡排序
func BubbleSort(a []int) {
n := len(a)
for i := n; i > ; i-- {
for j := ; j < i-; j++ {
if a[j] > a[j+] {
a[j], a[j+] = a[j+], a[j]
}
}
}
} // 选择排序
func SelectSort(a []int) {
n := len(a)
for i := ; i < n-; i++ {
k := i
for j := i + ; j < n; j++ {
if a[j] < a[k] {
k = j
}
}
a[i], a[k] = a[k], a[i]
}
} // 插入排序
func InsertionSort(a []int) {
n := len(a)
for i := ; i < n; i++ {
temp := a[i]
j := i -
for ; j >= && a[j] > temp; j-- {
a[j+] = a[j]
}
a[j+] = temp
}
} // 希尔排序
func ShellSort(a []int) {
n := len(a)
for d := n / ; d >= ; d /= {
for i := d; i < n; i++ {
temp := a[i]
j := i - d
for ; j >= && a[j] > temp; j -= d {
a[j+d] = a[j]
}
a[j+d] = temp
}
}
} // 快速排序的一次划分
func partition(a []int, s int, e int) int {
temp := a[s]
i := s
j := e
for i < j {
for i < j && a[j] > temp {
j--
}
if i < j {
a[i] = a[j]
i++
}
for i < j && a[i] < temp {
i++
}
if i < j {
a[j] = a[i]
j--
}
}
a[i] = temp
return i
} // 快速排序
func QuickSort(a []int, s int, e int) {
if s >= e {
return
}
i := partition(a, s, e)
QuickSort(a, s, i-)
QuickSort(a, i+, e)
} // 堆排序
func HeapSort(a []int) {
n := len(a)
// 建堆
for i := n/ - ; i >= ; i-- {
k := i
for *k+ < n {
j := *k +
if j+ < n && a[j] < a[j+] {
j++
}
if a[j] > a[k] {
a[k], a[j] = a[j], a[k]
k = j
} else {
break
}
}
}
// 调整堆
for i := n - ; i > ; i-- {
a[], a[i] = a[i], a[]
k :=
for *k+ < i {
j := *k +
if j+ < i && a[j] < a[j+] {
j++
}
if a[j] > a[k] {
a[k], a[j] = a[j], a[k]
k = j
} else {
break
}
}
}
} // 合并一次
func mergeOne(a []int, b []int, n int, len int) {
i :=
for i+len < n {
j := i + *len -
if j >= n {
j = n -
}
m := i
k := i
l := i + len
for i < k+len && l <= j {
if a[i] <= a[l] {
b[m] = a[i]
m++
i++
} else {
b[m] = a[l]
m++
l++
}
}
for i < k+len {
b[m] = a[i]
m++
i++
}
for l <= j {
b[m] = a[l]
m++
l++
}
i = j +
}
if i < n {
for ; i < n; i++ {
b[i] = a[i]
}
}
} // 归并排序
func MergeSort(a []int) {
n := len(a)
b := make([]int, n)
len :=
flag :=
for len < n {
if flag == {
mergeOne(a, b, n, len)
}
if flag == {
mergeOne(b, a, n, len)
}
flag = - flag
len *=
}
if flag == {
for i := ; i < n; i++ {
a[i] = b[i]
}
}
}

github链接地址:https://github.com/gaopeng527/go_Algorithm/blob/master/sort.go