排序算法(上)
排序算法
- 1.插入排序
- 2. 希爾排序
- 3. 選擇排序
- 4 .堆排序
1.插入排序
func insertSort(arr []int) {// 將數組分為已經排序好的區間[0, bound), 和未排序好的區間[bound,length]for i := 0; i < len(arr); i++ {end := i-1cur := arr[i]// 如果遇到了比cur大的元素就需要往后搬for end >= 0 && arr[end] > cur {arr[end+1] = arr[end]end--}arr[end+1] = cur} }時間復雜度O(n^2)
空間復雜度O(1)
2. 希爾排序
希爾排序就是將插入排序多分了幾個組, 對每個組都使用插入排序
常常使用的gap = len(arr)/2, 之后再依次除以2
3. 選擇排序
將當前下標先看做最小值, 然后依次從[i, len(arr)-1]的位置找到一個最小值的下標
func selectSort(arr []int) {if arr == nil || len(arr) < 2 {return}// 每次定義一個position, 用來找到后面的數組中的最小值for i := 0; i < len(arr)-1; i++ {// 以本次的i為下標先當做最小的元素position := ifor j := position+1; j < len(arr); j++ {if arr[j] < arr[position] {position = j}}arr[i], arr[position] = arr[position], arr[i]} }O(n^2)
O(1) 常數級變量
還有一種可以改進的選擇排序思想, 就是在找最小值的下標時, 同時找到最大值的下標與最后的元素交換, 這樣就可以減少循環的次數
4 .堆排序
堆排和快排是兩個最重要的排序也是面試中考的最多的, 一定要動手實現幾次,
想要練習堆排, 建議可以去做力扣215題
時間復雜度O(n*logn)
空間O(1)(忽略遞歸使用的棧空間)
總結
- 上一篇: List有关知识与ArrayList的实
- 下一篇: Redis简单动态字符串