欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang雙指針快速排序的實(shí)現(xiàn)代碼

 更新時(shí)間:2024年03月25日 10:18:35   作者:Dandelion_Promise  
這篇文章主要介紹了golang雙指針快速排序的實(shí)現(xiàn)代碼,通過實(shí)例代碼補(bǔ)充介紹了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)大廠,請關(guān)注我,了解非科班的程序員的工作生活把

快速排序算法
快速排序算法步驟如下:

  • 首先從一個(gè)數(shù)組里找一個(gè)基準(zhǔn)
  • 對數(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大
	//因此對l前面和后面的數(shù)組再次快排,直到子數(shù)組長度為1結(jié)束
	quickSort(data[:l])
	quickSort(data[l+1:])
}

歸并排序算法
步驟如下:

  • 把數(shù)組二分為left和right
  • 對left和right再次二分
  • 直到數(shù)組長度為1返回
  • 對于每兩個(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:])
	//對于每對數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang Gin框架實(shí)現(xiàn)文件下載功能的示例代碼

    Golang Gin框架實(shí)現(xiàn)文件下載功能的示例代碼

    本文主要介紹了Golang Gin框架實(shí)現(xiàn)文件下載功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言中for和range的性能比較

    Go語言中for和range的性能比較

    這篇文章主要為大家詳細(xì)介紹了Go語言中for和range語句的使用以及性能比較,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • go內(nèi)存緩存如何new一個(gè)bigcache對象示例詳解

    go內(nèi)存緩存如何new一個(gè)bigcache對象示例詳解

    這篇文章主要為大家介紹了go內(nèi)存緩存如何new一個(gè)bigcache對象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang結(jié)構(gòu)化日志log/slog包之LogValuer的用法簡介

    golang結(jié)構(gòu)化日志log/slog包之LogValuer的用法簡介

    這篇文章主要為大家詳細(xì)介紹了golang結(jié)構(gòu)化日志log/slog包中 LogValuer 和日志記錄函數(shù)的正確包裝方法,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • Golang項(xiàng)目搭配nginx部署反向代理負(fù)載均衡講解

    Golang項(xiàng)目搭配nginx部署反向代理負(fù)載均衡講解

    這篇文章主要為大家介紹了Golang項(xiàng)目搭配nginx部署正反向代理負(fù)載均衡講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang 處理浮點(diǎn)數(shù)遇到的精度問題(使用decimal)

    Golang 處理浮點(diǎn)數(shù)遇到的精度問題(使用decimal)

    本文主要介紹了Golang 處理浮點(diǎn)數(shù)遇到的精度問題,不使用decimal會(huì)出大問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式

    golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式

    這篇文章主要介紹了golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 一文詳解如何使用 Golang 處理文件

    一文詳解如何使用 Golang 處理文件

    Golang 是一種強(qiáng)類型、靜態(tài)編譯、并發(fā)性高的編程語言,我們將重點(diǎn)介紹 Golang 中的文件基本操作,包括創(chuàng)建文件與查看狀態(tài),重命名與移動(dòng),刪除與截?cái)啵x寫文件,以及權(quán)限控制,跟著小編一起來學(xué)習(xí)吧
    2023-04-04
  • 詳解Go是如何優(yōu)雅的進(jìn)行內(nèi)存管理

    詳解Go是如何優(yōu)雅的進(jìn)行內(nèi)存管理

    Go語言拋棄C/C++中的開發(fā)者管理內(nèi)存的方式,實(shí)現(xiàn)了主動(dòng)申請與主動(dòng)釋放管理,增加了逃逸分析和垃圾回收,將開發(fā)者從內(nèi)存管理中釋放出來,作為進(jìn)階的Go開發(fā),了解掌握Go的內(nèi)存管理還是很有必要的
    2023-09-09
  • Golang 中的直接依賴和間接依賴管理詳解

    Golang 中的直接依賴和間接依賴管理詳解

    在 Golang 中,依賴管理是非常重要的,直接依賴是指項(xiàng)目代碼中明確引用的其他包的依賴,而間接依賴是指直接依賴所引用的其他包的依賴,這篇文章主要介紹了Golang 中的直接依賴和間接依賴管理,需要的朋友可以參考下
    2023-11-11

最新評論