常用排序算法
洪笳淏 Lv4

选择排序

插入排序

冒泡排序

快速排序

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
}
  • Post title:常用排序算法
  • Post author:洪笳淏
  • Create time:2022-04-07 19:51:00
  • Post link:https://jiahaohong1997.github.io/2022/04/07/常用排序算法/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments