O(N^2)排序
冒泡排序
选择排序
插入排序
O(logN)排序
快速排序
func quickSort(nums []int) {lth := len(nums)if lth < 2 {return}pivotN := nums[0]left, right := 0, lth-1for left < right {for left < right && pivotN <= nums[right] {right--}for left < right && nums[left] <= pivotN {left++}nums[left], nums[right] = nums[right], nums[left]}nums[left] = pivotNquickSort(nums[:left])quickSort(nums[left+1:])}
归并排序
func mergesort(s []int) []int {if len(s) < 2 {return s}mid := len(s) / 2l := mergesort(s[:mid])r := mergesort(s[mid:])return merge(l, r)}func merge(l, r []int) []int {var s []intfor i, j := 0, 0; ; {if i == len(l) {return append(s, r[j:]...)}if j == len(r) {return append(s, l[i:]...)}if l[i] < r[j] {s = append(s, l[i])i++} else {s = append(s, r[j])j++}}}
堆排序
以将无序数列排列为从小到大序列为例:
- 从最后一个非叶子节点开始堆化,构建一个大顶堆;
- pop()出来一个最大元素加入有序部分的第一个位置,有序部分+1,无序部分-1;
- 重复步骤2,直到整个数组有序;
```go
func sortArray(nums []int) []int {
end := len(nums) - 1
// 从最后一个非叶子节点自下而上构造一个大顶堆
for i := len(nums)/2; i >= 0; i— {
} // 不断构造有序部分,缩小堆大小 for i := end; i >= 0; i— {heapify(nums, i, end)
} return nums }// 将无需部分最大值移动到有序部分最前方,以构造递增序列nums[i], nums[0] = nums[0], nums[i]end--heapify(nums, 0, end)
// 将 nums 下标范围为 [root, end] 的节点构造为堆 func heapify(nums []int, root, end int) { for { maxChild := root * 2 + 1 // maxChild指向子节点中较大的一个 if maxChild > end { return } if maxChild + 1 <= end && nums[maxChild] < nums[maxChild+1] { maxChild++ } if nums[root] > nums[maxChild] { return } nums[root], nums[maxChild] = nums[maxChild], nums[root] root = maxChild } } ```
