工程中的排序算法应用
各语言内置库都会使用「混合排序算法」,在不同场景下会使用不同的排序算法, 比如在数据长度较少时会采用「插入排序Insert Sort」(时间复杂度O(n^2)), 其他情况会使用「快速排序Quick Sort」, 但是快排的效率取决于pivot选择, 最差情况下时间复杂度会降低到O(n^2), 所以有的会选择「堆排序Heap Sort」作为默认的排序算法, 因为堆排稳定在O(n*logn)
各排序算法性能汇总
| Algorightm | Expected Time Complexity | The Worst Time Complexity | The Best Time Complexity | Space Complexity |
|---|---|---|---|---|
| Quick Sort | (sequence is reverse) | |||
| Insert Sort | (already sequential) | |||
| Bubble Sort | 1 | |||
| Select Sort | 1 |
Quick Sort
Go Implement
// Given Format
func QuickSort(a []int) []int {
if len(a) < 1 {
return a
}
recursionQuickSort(a, 0, len(a)-1)
return a
}
func recursionQuickSort(a []int, l, r int) {
if l<0 || r>len(a)-1 || l>=r { // Edge Case
return
}
pivot := a[l]
left, right := l, r
for left < right {
for left < right && a[right] >= pivot {
right --
}
for left < right && a[left] <= pivot {
left ++
}
a[left], a[right] = a[right], a[left]
}
a[left], a[l] = a[l], a[left]
// Next Recursion
recursionQuickSort(a, l, left - 1)
recursionQuickSort(a, left + 1, r)
}
Insert Sort
Go Implement
func InsertSort(a []int) []int {
if len(a) < 2 {
return a
}
for i:=1;i<len(a);i++ {
for j:=i;j>0;j-- {
if a[j] < a[j-1] {
a[j], a[j-1] = a[j-1], a[j]
} else {
break // 及时停止,节省时间
}
}
}
return a
}
Bubble Sort
Go Implement
func BubbleSort(a []int) []int {
if len(a) < 2 {
return a
}
for i:=len(a)-1;i>0;i-- {
for j:=1;j<=i;j++ {
if a[j-1] > a[j] {
a[j-1], a[j] = a[j], a[j-1]
}
}
}
return a
}
Select Sort
Go Implement
func SelectSort(a []int) []int {
if len(a) < 2 {
return a
}
for i:=len(a)-1;i>0;i-- {
max := 0
for j:=0;j<=i;j++ {
if a[j] > a[max] {
max = j
}
}
a[i], a[max] = a[max], a[i]
}
return a
}
REF
- mojotv.cn/algorithm/g…
- https://tech.byte_dance.net/articles/7058110551951409165?from=lark_all_search