几种基本排序
1.快速排序
快速排序就是用递归把数组拆分成最小单元在组合起来
func FastSort(slice []int) []int { if len(slice) <= 1 { return slice } index := len(slice) / 2 value := slice[index] slice = append(slice[:index], slice[index+1:]...) leftSlice := []int{} rightSlice := []int{} for i := 0; i < len(slice); i++ { if slice[i] < value { leftSlice = append(leftSlice, slice[i]) } else { rightSlice = append(rightSlice, slice[i]) } } s := append(append(FastSort(leftSlice), value), FastSort(rightSlice)...) return s }
2.选择排序
选择排序找出比当前被比较的值还小的值的索引,进行交换
func SelectSort(arr []int) []int { //从第一个到倒数第二个 for i := 0; i < len(arr)-1; i++ { minIndex := i //从i+1开始和i比,直到最后一个 for j := i + 1; j < len(arr); j++ { if arr[minIndex] > arr[j] { minIndex = j } } if minIndex != i { arr[minIndex], arr[i] = arr[i], arr[minIndex] } } return arr }
3.冒泡排序
用第n个和n+1进行比较,进行n轮
func BubbleSort(slice []int) []int { for i := 0; i < len(slice)-1; i++ { for j := 0; j < len(slice)-1-i; j++ { if slice[j+1] < slice[j] { slice[j+1], slice[j] = slice[j], slice[j+1] } } } return slice }
4.插入排序
用i+1个往前和i对比,只要i+1小于i,并且i>0就一直交换下去
func InsertSort(arr []int) []int { for i := 0; i < len(arr)-1; i++ { for j := i + 1; j > 0 && arr[j-1] > arr[j]; j-- { arr[j-1], arr[j] = arr[j], arr[j-1] } } return arr }
5.希尔排序
希尔排序是插入排序的另一个版本,每次跨度不只是1
func ShellSort(slice []int) []int { for i := len(slice) / 2; i > 0; i /= 2 { for j := i; j < len(slice); j++ { for k := j; k-i >= 0 && slice[k] < slice[k-i]; k -= i { slice[k], slice[k-i] = slice[k-i], slice[k] } } } return slice }