golang雙指針快速排序的實(shí)現(xiàn)代碼
golang雙指針快速排序
快速排序算法思想:選中間位置作為基準(zhǔn),比它值小的移動(dòng)到左邊,比它大的值移動(dòng)到右邊。然后把基準(zhǔn)值和末位元素交換(方便比較和移動(dòng))。定義兩個(gè)指針left(起始位置0), right(起始位置len(arr) - 2), 循環(huán)和基準(zhǔn)值比較,每次比較確定一個(gè)位置,移動(dòng)指針,直到不滿足left <= right.
注意:快速排序是一種原地排序,不依賴額外空間復(fù)雜度,但不是穩(wěn)定的排序
時(shí)間復(fù)雜度:平均為O(nlogn), 最慢為O(n^2)。粗略計(jì)算時(shí)間復(fù)雜度主要分為2個(gè)部分,分區(qū)(O(n))和遞歸(O(logn)), 相乘為O(nlogn)。
空間復(fù)雜度:O(1)
package main
import "fmt"
func QuickSort(arr []int) {
if len(arr) <= 1 {
return
}
// 選中間位置作為基準(zhǔn),比它值小的移動(dòng)到左邊,比它大的值移動(dòng)到右邊
pivotIndex := len(arr) / 2
pivot := arr[pivotIndex]
arr[pivotIndex], arr[len(arr)-1] = arr[len(arr)-1], arr[pivotIndex]
left := 0
right := len(arr) - 2
for left <= right { // 每一輪移動(dòng)一次指針
if arr[left] <= pivot {
left++
} else {
arr[left], arr[right] = arr[right], arr[left]
right--
}
}
pivotIndex = left
arr[left], arr[len(arr)-1] = arr[len(arr)-1], arr[left]
QuickSort(arr[:pivotIndex])
QuickSort(arr[pivotIndex+1:])
}
func main() {
arr := []int{4, 1, 3, 5, 2}
QuickSort(arr)
fmt.Println(arr)
}擴(kuò)展:
Golang實(shí)現(xiàn)快速排序和歸并排序以及堆排序算法全注釋
douyin LSY_HELLOWORLD,已成功入職互聯(lián)網(wǎng)大廠,請(qǐng)關(guān)注我,了解非科班的程序員的工作生活把
快速排序算法
快速排序算法步驟如下:
- 首先從一個(gè)數(shù)組里找一個(gè)基準(zhǔn)
- 對(duì)數(shù)組進(jìn)行遍歷
- 把比基準(zhǔn)小的放基準(zhǔn)左邊,把比基準(zhǔn)大的放基準(zhǔn)右邊
- 以基準(zhǔn)為分割點(diǎn),分成兩個(gè)數(shù)組重復(fù)1-4步驟
- 直到數(shù)組長度為1返回
func quickSort(data []int) {
//如果數(shù)組長度為1,返回
if len(data) <= 1 {
return
}
//設(shè)置基準(zhǔn)為數(shù)組第一個(gè)元素
base := data[0]
//兩個(gè)指針分別指向待交換首尾位置
l, r := 0, len(data)-1
//基準(zhǔn)為第一個(gè)元素,比較的元素從第二個(gè)開始
for i := 1; i <= r; {
//如果比較元素大于基準(zhǔn)元素,把該元素放到數(shù)組尾部,把尾部元素交換過來
//此時(shí)尾部的元素已經(jīng)判斷過比基準(zhǔn)元素大,因此r--向前移動(dòng),
//而i所在的元素為新交換過來的還沒有判斷過大小,因此保持不動(dòng)
if data[i] > base {
data[i], data[r] = data[r], data[i]
r--
} else {
//如果比較元素小于等于基準(zhǔn)元素,則交換當(dāng)前元素和基準(zhǔn)元素的位置
//l指向的是基準(zhǔn)元素,因此l++才能重新指向基準(zhǔn)元素,i++判斷下一個(gè)數(shù)
data[i], data[l] = data[l], data[i]
l++
i++
}
}
//此時(shí)l指向基準(zhǔn)元素,l前面的元素都比l小,l后面的都比l大
//因此對(duì)l前面和后面的數(shù)組再次快排,直到子數(shù)組長度為1結(jié)束
quickSort(data[:l])
quickSort(data[l+1:])
}歸并排序算法
步驟如下:
- 把數(shù)組二分為left和right
- 對(duì)left和right再次二分
- 直到數(shù)組長度為1返回
- 對(duì)于每兩個(gè)子數(shù)組進(jìn)行重排,按照大小添加
- 進(jìn)行遞歸就行了
func mergeSort(data []int) []int {
length := len(data)
//如果長度為1不可再分,就返回
if length <= 1 {
return data
}
//把數(shù)組一分為二
num := length / 2
//左邊和右邊的數(shù)組都要再分
left := mergeSort(data[:num])
right := mergeSort(data[num:])
//對(duì)于每對(duì)數(shù)組進(jìn)行排序
return merge(left, right)
}
func merge(left, right []int) (result []int) {
//數(shù)組是從長度為1開始進(jìn)行添加的,因此每個(gè)子數(shù)組都是有序的
l, r := 0, 0
//當(dāng)兩個(gè)數(shù)組都沒有遍歷完的時(shí)候,按照元素大小依次添加
for l < len(left) && r < len(right) {
if left[l] < right[r] {
result = append(result, left[l])
l++
} else {
result = append(result, right[r])
r++
}
}
//一個(gè)數(shù)組遍歷完比,把沒有遍歷完的數(shù)組直接添加進(jìn)去
result = append(result, left[l:]...)
result = append(result, right[r:]...)
return
}堆排序算法
func heapSort(array []int) {
m := len(array)
s := m / 2
for i := s; i > -1; i-- {
heap(array, i, m-1)
}
for i := m - 1; i > 0; i-- {
array[i], array[0] = array[0], array[i]
heap(array, 0, i-1)
}
}
func heap(array []int, i, end int) {
l := 2*i + 1
if l > end {
return
}
n := l
r := 2*i + 2
if r <= end && array[r] > array[l] {
n = r
}
if array[i] > array[n] {
return
}
array[n], array[i] = array[i], array[n]
heap(array, n, end)
}到此這篇關(guān)于golang雙指針快速排序的文章就介紹到這了,更多相關(guān)golang雙指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解
這篇文章主要介紹了Go基礎(chǔ)教程系列之import導(dǎo)包和初始化詳解,需要的朋友可以參考下2022-04-04
Go 使用環(huán)境變量的實(shí)現(xiàn)小結(jié)
作為軟件開發(fā)人員,在項(xiàng)目中管理配置變量的重要性,本文主要介紹在 Golang 中處理環(huán)境變量的強(qiáng)大工具 github.com/joho/godotenv 包,利用這個(gè)包,你可以簡化處理 .env 文件的過程,感興趣的可以了解一下2025-11-11
Golang 零值、空值與空結(jié)構(gòu)的使用小結(jié)
本文主要介紹了Golang 零值、空值與空結(jié)構(gòu)的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02
golang sql連接池的實(shí)現(xiàn)方法詳解
database/sql是golang的標(biāo)準(zhǔn)庫之一,它提供了一系列接口方法,用于訪問關(guān)系數(shù)據(jù)庫。下面這篇文章主要給大家介紹了關(guān)于golang sql連接池用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧2018-09-09
Go語言實(shí)現(xiàn)的一個(gè)簡單Web服務(wù)器
這篇文章主要介紹了Go語言實(shí)現(xiàn)的一個(gè)簡單Web服務(wù)器,本文先是給出一個(gè)使用http包建立的Web服務(wù)器源碼,并對(duì)比了其它編程語言,需要的朋友可以參考下2014-10-10
簡單聊聊Golang中defer預(yù)計(jì)算參數(shù)
在golang當(dāng)中defer代碼塊會(huì)在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Golang中defer預(yù)計(jì)算參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03

