初学Golang,同时为了熟悉一下排序算法。用Go语言实现了一下各种排序算法。
1. 冒泡排序
冒泡排序,最简单的排序算法之一。通过两层嵌套的循环实现对数组的排序。
可以这样理解:
-
外层循环,每次找到剩余数组中最大值放于最后的位置。
-
内嵌循环,通过 比较与 元素置换 将较大值一步步移动到最后位置
下面是Go语言实现:
func main() {
arr := []int{2, 3, 4, 6, 134, 76, 12, 98, 1, 1, 34, 9}
//1.冒泡排序 BubbleSort
//牛客题:失败了,时间超出
arr_bubbleSort := make([]int, len(arr))
copy(arr_bubbleSort, arr)
bubbleSortResult := BubbleSort(arr_bubbleSort)
fmt.Println("冒泡排序:", bubbleSortResult)
}
func BubbleSort(arr []int) []int {
//1.遍历,比较两个数大小,大的放后面。一遍后最大的数就在最后了
for i := len(arr) - 1; i > 0; i-- {
for j := 0; j < i; j++ {
if arr[j] > arr[j+1] {
temp := arr[j+1]
arr[j+1] = arr[j]
arr[j] = temp
}
}
}
return arr
}
通过牛客网上的题测试,该算法时间超出。
冒泡排序算法的时间复杂度是O(n^2)。超时也在预料中。
上文冒泡排序的实现是稳定性算法,稳定性是指 排序后相等元素的先后顺序不变。
2. 插入排序
插入排序的复杂度也是O(n^2),但是实际开发中相比冒泡排序,更倾向于使用插入排序。这是因为插入排序在嵌套循环里只需更换一次元素,而冒泡排序每次置换经过了三次赋值操作。
插入排序详述为:
-
从第一个元素开始遍历,认为前面的都是已经排序好的。
-
后面的元素跟前一个比较,小的往前排,直到遇到比自己小的停止内层循环
3. 选择排序
选择排序的复杂度:O(n^2)
选择排序具体描述:
-
从最后一个元素开始往前遍历数组
-
内层循环通过比较 获取 最大值所在索引
-
置换最大值与外层索引的值。这样最大值就排在了最后
代码实现如下:
func main() {
arr := []int{2, 3, 4, 6, 134, 76, 12, 98, 1, 1, 34, 9}
//2.选择排序 SelectionSort
arr_selectionSort := make([]int, len(arr))
copy(arr_selectionSort, arr)
selectionSortResult := SelectionSort(arr_selectionSort)
fmt.Println("选择排序:", selectionSortResult)
}
func SelectionSort(arr []int) []int {
//用最后一个数 和 前面的比较,最后最大值存到最后的位置。
for i := len(arr) - 1; i > 0; i-- {
index := i
for j := 0; j < i; j++ {
if arr[j] > arr[index] {
index = j
}
}
temp := arr[index]
arr[index] = arr[i]
arr[i] = temp
}
return arr
}
4. 快速排序
快速排序的复杂度:O(nlog(n))
快排使用了递归的方法。具体描述如下:
-
通过一个随机值对整个数组进行分组,左边的小于该数值,右边的大于该数值。
-
分别对两边的数组再次使用该方法划分,直到递归数组只有一个元素
-
最后整个数组就是有序的。
Go实现:
func main() {
arr := []int{2, 3, 4, 6, 134, 76, 12, 98, 1, 1, 34, 9}
//3.快速排序 QuickSort
arr_quickSort := make([]int, len(arr))
copy(arr_quickSort, arr)
quickSortResult := QuickSort(arr_quickSort)
fmt.Println("快速排序", quickSortResult)
}
func quickSort_recursion(arr []int, left, right int) {
i, j := left, right
//递归终止条件
if right <= left {
return
}
key := arr[i]
for i < j {
for i < j && arr[j] >= key {
j--
}
arr[i] = arr[j]
for i < j && arr[i] <= key {
i++
}
arr[j] = arr[i]
}
arr[i] = key
quickSort_recursion(arr, left, i-1)
quickSort_recursion(arr, i+1, right)
}