排序算法(上)
排序算法
- 1.插入排序
- 2. 希爾排序
- 3. 選擇排序
- 4 .堆排序
1.插入排序
func insertSort(arr []int) {// 將數(shù)組分為已經(jīng)排序好的區(qū)間[0, bound), 和未排序好的區(qū)間[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} }時間復(fù)雜度O(n^2)
空間復(fù)雜度O(1)
2. 希爾排序
希爾排序就是將插入排序多分了幾個組, 對每個組都使用插入排序
常常使用的gap = len(arr)/2, 之后再依次除以2
3. 選擇排序
將當(dāng)前下標(biāo)先看做最小值, 然后依次從[i, len(arr)-1]的位置找到一個最小值的下標(biāo)
func selectSort(arr []int) {if arr == nil || len(arr) < 2 {return}// 每次定義一個position, 用來找到后面的數(shù)組中的最小值for i := 0; i < len(arr)-1; i++ {// 以本次的i為下標(biāo)先當(dāng)做最小的元素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) 常數(shù)級變量
還有一種可以改進(jìn)的選擇排序思想, 就是在找最小值的下標(biāo)時, 同時找到最大值的下標(biāo)與最后的元素交換, 這樣就可以減少循環(huán)的次數(shù)
4 .堆排序
堆排和快排是兩個最重要的排序也是面試中考的最多的, 一定要動手實(shí)現(xiàn)幾次,
想要練習(xí)堆排, 建議可以去做力扣215題
時間復(fù)雜度O(n*logn)
空間O(1)(忽略遞歸使用的棧空間)
總結(jié)
- 上一篇: List有关知识与ArrayList的实
- 下一篇: 简谈TCP的八个特性