选择排序
插入排序
冒泡排序
快速排序
Go 语言代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| func quickSort(nums []int) []int { var backTracking func(arr []int) { if len(arr) == 0 || len(arr) == 1 { return } l, r := 0, len(arr)-1 mid := l for l < r { for l < r && arr[r] >= arr[mid] { r-- } for l < r && arr[l] <= arr[mid] { l++ } arr[l], arr[r] = arr[r], arr[l] } arr[l], arr[mid] = arr[mid], arr[l] backTracking(arr[:l]) backTracking(arr[l+1:]) } backTracking(nums) return nums }
|
归并排序
Go 语言代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| func mergeSort(nums []int) []int { var backTracking func(arr []int) []int backTracking = func(arr []int) []int { if len(arr) == 0 || len(arr) == 1 { return arr } n := len(arr) a := backTracking(arr[:n/2]) b := backTracking(arr[n/2:]) ret := []int{} i, j := 0, 0 for i < len(a) || j < len(b) { if i == len(a) { ret = append(ret, b...) j = len(b) } else if j == len(b) { ret = append(ret, a...) i = len(a) } else { if a[i] <= b[j] { ret = append(ret, a[i]) i++ } else { ret = append(ret, b[j]) j++ } } } return ret } return backTracking(nums) }
|
堆排序
基数排序
算法介绍
基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
效率
基数排序的时间复杂度是 $O(k * N)$,其中 $N$是排序元素个数,$k$ 是数字位数。注意这不是说这个时间复杂度一定优于 $O(NlogN)$,$k$ 的大小取决于数字位的选择(比如比特位数),和待排序数据所属数据类型的全集的大小;$k$ 决定了进行多少轮处理,而 $N$ 是每轮处理的操作数目。
Go 语言代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| func radixSort(nums []int) []int { var maxNum func(...int) int maxNum = func(array ...int) int { max := array[0] for i:=1; i<len(array); i++ { if array[i] > max { max = array[i] } } return max } cnt := make([]int, 10) buf := make([]int, len(nums)) for exp:=1; exp<=maxNum(nums...); exp*=10 { for i:=0; i<len(nums); i++ { digit := nums[i] / exp % 10 cnt[digit]++ } for i:=1; i<10; i++ { cnt[i] += cnt[i-1] } for i:=len(nums)-1; i>=0; i-- { digit := nums[i] / exp % 10 buf[cnt[digit]-1] = nums[i] cnt[digit]-- } } return nums }
|