一、排序算法
排序算法有比较多种,其中快速排序基本上是经常被提问到算法。在这个代码中,有冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序。其中在控制台与用户进行交互,用户输入对应的数据,选择对应的排序,即可是实现排序的效果。
package main
import "fmt"
// 冒泡
func maopao(arr []int) []int {
len_num := len(arr)
fmt.Println(arr)
for i := 0; i < len_num; i++ {
for j := 0; j < len_num-i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
return arr
}
// 选择
func xuanzhe(arr []int) []int {
len_num, min_index := len(arr), 0
for i := 0; i < len_num; i++ {
min_index = i
for j := i; j < len_num; j++ {
if arr[j] < arr[min_index] {
min_index = j
}
}
arr[i], arr[min_index] = arr[min_index], arr[i]
}
return arr
}
// 插入排序
func charu(arr []int) []int {
len_num := len(arr)
for i := 1; i < len_num; i++ {
flag := arr[i]
for j := i - 1; j >= 0; j-- {
if flag < arr[j] {
arr[j], arr[j+1] = arr[j+1], arr[j]
} else {
arr[j+1] = flag
break
}
}
}
return arr
}
// 快排
func partition(arr []int, left int, right int) int {
tmp := arr[left]
for left < right {
for left < right && arr[right] >= tmp {
right -= 1
}
arr[left] = arr[right]
for left < right && arr[left] <= tmp {
left += 1
}
arr[right] = arr[left]
}
arr[left] = tmp
return left
}
func kuaipai(arr []int, left int, right int) []int {
if left < right {
mid := partition(arr, left, right)
kuaipai(arr, left, mid-1)
kuaipai(arr, mid+1, right)
}
return arr
}
// 希尔排序
func insert_sort_gap(arr []int, gap int) {
for i := gap; i < len(arr); i++ {
tmp := arr[i]
j := i - gap
for j >= 0 && arr[j] > tmp {
arr[j+gap] = arr[j]
j -= gap
}
arr[j+gap] = tmp
}
}
func shell_sort(arr []int) []int {
len_num := len(arr) / 2
for len_num >= 1 {
insert_sort_gap(arr, len_num)
len_num /= 2
}
return arr
}
// 归并
func merge(arr []int, low int, mid int, high int) {
i, j := low, mid+1
ltmp := make([]int, 0)
for i <= mid && j <= high {
if arr[i] < arr[j] {
ltmp = append(ltmp, arr[i])
i += 1
} else {
ltmp = append(ltmp, arr[j])
j += 1
}
}
for i <= mid {
ltmp = append(ltmp, arr[i])
i += 1
}
for j <= high {
ltmp = append(ltmp, arr[j])
j += 1
}
for _, v := range ltmp {
arr[low] = v
low += 1
}
}
func merge_sort(arr []int, low int, high int) []int {
if low < high {
mid := (low + high) / 2
merge_sort(arr, low, mid)
merge_sort(arr, mid+1, high)
merge(arr, low, mid, high)
}
return arr
}
func main() {
var arr []int
fmt.Println("输入您的数字, -1结束输入")
for {
var line int
_, _ = fmt.Scanf("%d", &line)
if line != -1 && line != 0 {
arr = append(arr, line)
} else if line == 0 {
continue
} else {
break
}
}
// 输入您要的排序
fmt.Println("输入您的排序, 1:冒泡, 2:选择, 3:插入, 4:快排, 5:希尔, 6:归并")
var sort_num string
for {
_, _ = fmt.Scanf("%s", &sort_num)
if sort_num != "" {
break
}
}
switch sort_num {
case "1":
arr1 := maopao(arr)
fmt.Println(arr1)
case "2":
arr1 := xuanzhe(arr)
fmt.Println(arr1)
case "3":
arr1 := charu(arr)
fmt.Println(arr1)
case "4":
left, right := 0, len(arr)-1
arr1 := kuaipai(arr, left, right)
fmt.Println(arr1)
case "5":
arr1 := shell_sort(arr)
fmt.Println(arr1)
case "6":
low, high := 0, len(arr)-1
arr1 := merge_sort(arr, low, high)
fmt.Println(arr1)
default:
fmt.Println("结束")
}
}