go語言基本排序算法

package mainimport "fmt"func main() {BubbleSort()SelectSort()InsertSort()MergeSort()QuickSort()HeapSort()ShellSort()
}//冒泡排序
func BubbleSort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i := 0; i < len(str)-1; i++ {flag := falsefor j := len(str) - 1; j > i; j-- {if str[j] < str[j-1] {str[j], str[j-1] = str[j-1], str[j]flag = true}}if !flag {break}}fmt.Println("BubbleSort: ", str)
}//選擇排序
func SelectSort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i := 0; i < len(str)-1; i++ {min := ifor j := i + 1; j <= len(str)-1; j++ {if str[j] < str[min] {min = j}}if min != i {str[i], str[min] = str[min], str[i]}}fmt.Println("SelectSort: ", str)
}//插入排序
func InsertSort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i := 1; i <= len(str)-1; i++ {temp := str[i]j := i - 1for ; j >= 0 && str[j] > temp; j-- {str[j+1] = str[j]}str[j+1] = temp}fmt.Println("InsertSort: ", str)
}// 希爾排序   與插入排序比較,把原來按順序變成了相隔增量,增量不能小于3
func ShellSort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}//increment相隔數量// for increment := len(str) / 3; increment > 0; increment /= 3 {increment := len(str)for increment > 0 {increment = increment / 3//此過程類似于插入排序的過程for i := increment; i <= len(str)-1; i++ {key := str[i]j := i - increment//按照increment,數組從j到0進行交換比較for ; j >= 0 && str[j] > key; j -= increment {str[j+increment] = str[j]}//str[j+increment] = key}}fmt.Println("ShellSort: ", str)
}//堆排序
func HeapSort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i := len(str) / 2; i >= 0; i-- {Heap_Adjust_0(str, len(str), i)}for i := len(str) - 1; i > 0; i-- {str[i], str[0] = str[0], str[i]Heap_Adjust_0(str, i, 0)}fmt.Println("HeapSort: ", str)
}// 函數0和函數1是同一種思路,只是寫法不同// 堆調整函數0
func Heap_Adjust_0(str []int, length, index int) {parent := indexchild := 2*parent + 1for ; child < length-1; child *= 2 {if str[child] < str[child+1] {child++}if str[parent] < str[child] {str[parent], str[child] = str[child], str[parent]parent = child}}
}// 堆調整函數1
func Heap_Adjust_1(str []int, length, index int) {largest := index     // 初始化最大元素為根節點left := 2*index + 1  // 左子節點索引right := 2*index + 2 // 右子節點索引// 如果左子節點大于根節點if left < length && str[left] > str[largest] {largest = left}// 如果右子節點大于最大元素if right < length && str[right] > str[largest] {largest = right}// 如果最大元素不是根節點if largest != index {str[index], str[largest] = str[largest], str[index]// 遞歸調整受影響的子樹Heap_Adjust_2(str, length, largest)}
}//歸并排序
func MergeSort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}str = Merging_Sort(str)fmt.Println("MergeSort: ", str)
}func Merging_Sort(str []int) []int {if len(str) <= 1 {return str}mid := len(str) / 2left := Merging_Sort(str[:mid])right := Merging_Sort(str[mid:])res := Merge_1(left, right)return res
}//合并函數0
func Merge_0(left, right []int) []int {result := make([]int, len(left)+len(right))i, j := 0, 0for k := 0; k < len(result); k++ {if i >= len(left) {result[k] = right[j]j++} else if j >= len(right) {result[k] = left[i]i++} else if left[i] < right[j] {result[k] = left[i]i++} else if right[j] < left[i] {result[k] = right[j]j++}}return result
}//合并函數1
func Merge_1(left, right []int) []int {//result := make([]int, 0, len(left)+len(right))var result []inti, j := 0, 0for {if i >= len(left) {result = append(result, right[j:]...)break} else if j >= len(right) {result = append(result, left[i:]...)break} else if left[i] < right[j] {result = append(result, left[i])i++} else if right[j] < left[i] {result = append(result, right[j])j++}}return result
}//快速排序
func QuickSort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}Quicking_Sort(str, 0, len(str)-1)fmt.Println("QuickSort: ", str)
}func Quicking_Sort(str []int, low, high int) {if low < high {pivot := Partition(str, low, high)Quicking_Sort(str, low, pivot-1)Quicking_Sort(str, pivot+1, high)}
}//獲取基準值函數
func Partition(str []int, low, high int) int {pivotky := str[low]for low < high {for low < high && str[low] < pivotky {low++}for low < high && str[high] > pivotky {high--}str[low], str[high] = str[high], str[low]}return low
}

排序算法的指標性能比較

????????????????????????????????????????????????????????????????????????表1

排序方法平均時間復雜度最好時間復雜度最壞時間復雜度輔助空間穩定性
冒泡排序O(n2)O(n)O(n2)O(1)穩定
簡單選擇排序O(n2)O(n2)O(n2)O(1)穩定
直接插入排序O(n2)O(n)O(n2)O(1)穩定
希爾排序  O(nlogn)~O(n2)O(n1.3)O(n2)O(1)不穩定
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不穩定
歸并排序O(nlogn)O(nlogn)O(nlogn)O(n)穩定
快速排序O(nlogn)O(n)O(n2)O(logn)~O(n)不穩定

一、七種排序算法的性能指標說明:

????????(1)冒泡排序:最壞的情況,即為序列處于逆序的情況,此時需要比較的次數為n(n-1)/2;最好的情況就是序列本身有序,那么需要比較的次數為n-1次,平均o(n2)

????????(2)簡單選擇排序:無論最好最差情況,其比較次數均為n(n-1)/2,對于交換次數而言,最好的情況,交換0次,最差的情況,交換次數為n-1次,那么綜合比較和交換的次數,平均時間復雜度為o(n2)

????????(3)直接插入排序:最好的情況,即排序表本身是有序的,比較了n-1次,時間復雜度為o(n);最壞的情況,即待排序為逆序,此時需要比較(n+2)*(n-1)/2,且移動的次數也達到最大(n+4)*(n-1)/2;如果排序記錄是隨機的,那么根據概率相同的原則,平均比較和移動次數為n2/4,因此,最壞和平均時間復雜度均為o(n2)

????????(4)希爾排序:希爾排序的好壞取決于增量的選取,究竟如何選取一個好的增量,目前仍然沒有一種最好的辦法。目前較好的情況,可以使希爾排序的時間復雜度縮減為O(n1.5)左右,最壞的情況仍然是o(n2)

????????(5)堆排序:在構建堆的過程中,因為我們是完全二叉樹從最下層最右邊的非終端結點開始構建,將它與其孩子進行比較和若有必要的交換,對于每個非終端結點而言,其實最多進行兩次比較和互換操作,因此這個構建堆的時間復雜度為o(n);在正式排序中,第i次取堆頂記錄重建堆需要用o(logi)的時間,并且需要取n-1次堆頂記錄,因此,重建堆的時間復雜度為o(nlogn);所以整體而言,對于堆排序,最好,最壞和平均情況,時間復雜度均為o(nlogn)

????????(6)歸并排序:一趟歸并需要將待排序序列中所有記錄掃描一遍,需要o(n)時間,而由完全二叉樹深度可知,整個歸并排序需要進行log2n,因此,總的時間復雜度為o(nlogn),并且zhe是歸并排序最好,最壞,平均性能。此外,歸并排序過程中,需要與原始記錄序列同樣數量的存儲空間存放歸并結果以及遞歸時深度為log2n的棧空間,因此空間復雜度為o(n+logn),也就是說歸并排序是一種比較占用內存的算法。此外,歸并排序需要兩兩比較,但不存在跳躍,因此歸并排序也是一種穩定的排序算法。

????????(7)快速排序,在最優的情況下,partition每次都劃分的很均勻,這樣不斷的劃分下去,時間復雜度為o(nlogn),在最壞的情況待排序為正序或者逆序,比較次數為n(n-1)/2,最終時間復雜度為o(n2),那么平均情況為o(nlogn)。就空間復雜度而言,主要是遞歸造成的棧空間使用,最好情況,遞歸深度為o(log2n),空間復雜度也就為o(n),最壞的情況需要進行n-1遞歸調用,空間復雜度o(n),所以平均情況空間復雜度也就為o(logn)由于關鍵字的比較和交換是跳躍進行的,所以快速排序不是一種穩定的算法。

二、七種算法在各個指標上的相互比較:

接下來,從各個指標分析這七種算法的優劣:

????????(1)從算法的簡單性來看:

????????????????簡單算法:冒泡,簡單選擇,直接插入

????????????????改進算法:希爾,堆,歸并,快速

????????(2)從平均情況來看,顯然三種改進算法要好于希爾排序,遠遠勝于前三種簡單排序

????????(3)從最好情況來看,冒泡排序和直接插入排序要更好一些,也就是說,如果待排序數組總是基本有序的,應該優先考慮冒泡和直接插入排序算法

????????(4)從最壞的情況來看,堆排序和歸并排序又強于快速排序和其他簡單排序

????????(5)從空間復雜度來看,歸并排序和快速排序都有相應的空間要求,這樣,如果執行算法的軟件所處的環境非常在乎內存使用量多少,現在歸并和快排顯然不是一個很好的辦法

????????(6)從穩定性來看,歸并排序獨占鰲頭,對于非常在乎排序穩定性的應用,歸并排序是個好算法

????????(7)從待排序記錄的個數來說,待排序的個數n越小,采用簡單排序方法越合適。反之,n越大,采用改進算法越合適。這樣,我們在采用快速排序優化時,考慮增加一個閾值,當待排序數目小于閾值采用直接插入排序,否則選擇快速排序

????????(8)從表1來看,似乎簡單選擇排序是最差的算法,但也并不完全,比如,如果記錄關鍵字本身信息量比較大,此時表面其占用內存空間較大,這樣移動記錄花費的時間就越多,下面給出三種簡單排序算法此時的"移動"次數比較:

????????????????????????????????????????????????????????????????????????表2

排序方法平均情況最好情況最差情況
冒泡o(n2)0o(n2)
簡單選擇o(n)0o(n)
直接插入o(n2)0o(n2)

????????你會發現,此時簡單選擇排序在最差情況就變得很有優勢,因為簡單選擇排序每次是通過與其后面的元素先一一比較,找到最小的元素,再與最小的元素進行交換,所以它的移動次數最多為n-1次。所以,對于數據量不是很大,但記錄關鍵字的信息量較大的排序要求,顯然簡單選擇排序是占優的。另外,記錄關鍵字信息量的大小對四種改進算法影響不大。

????????總結:從綜合各項指標來說,經過優化的快速排序是性能最好的排序算法,但是不同的場合也應該考慮使用不同的算法來應對它。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920790.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920790.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一步完成CalDAV賬戶同步,日歷服務助力釘釘日歷日程集中管理

在信息爆炸節奏飛快的今天&#xff0c;高效的管理時間已經成為我們工作和生活中的核心競爭力&#xff0c;復雜紛繁的日程安排&#xff0c;無處不在的提醒需求以及跨設備同步的困擾&#xff0c;這些問題仿佛都在呼喚著一個更智能、更便捷、更可靠的解決方案。 而華為日歷App&am…

企業內部機密視頻安全保護|如何防止企業內部機密視頻泄露?

在企業數字化進程飛速發展的今天&#xff0c;視頻內容已成為承載企業內部培訓、戰略會議、產品機密和核心技術的關鍵載體。一次意外的泄露&#xff0c;不僅可能導致知識產權流失&#xff0c;更會讓企業聲譽和市場競爭力遭受重創。面對無孔不入的安全威脅&#xff0c;企業該如何…

C# Deconstruct | 簡化元組與對象的數據提取

官方文檔&#xff1a;析構元組和其他類型 - C# | Microsoft Learn 標簽&#xff1a;Deconstruct、Tuple、record、模式匹配 PS&#xff1a;record相關內容后續還會繼續更新&#x1f504; 模式匹配可以查看我的另一篇&#x1f449;模式匹配 目錄1. 概述2. 基本用法2.1 元組解…

R 語言 ComplexUpset 包實戰:替代 Venn 圖的高級集合可視化方案

摘要 在生物信息學、數據挖掘等領域的集合分析中,傳統 Venn 圖在多維度數據展示時存在信息擁擠、可讀性差等問題。本文基于 R 語言的 ComplexUpset 包,以基因表達研究為場景,從包安裝、數據準備到可視化實現,完整演示如何制作正刊級別的集合交集圖,解決多條件下差異基因(…

?導游|基于SprinBoot+vue的在線預約導游系統

在線預約導游系統 基于SprinBootvue的在線預約導游系統 一、前言 二、系統設計 三、系統功能設計 前臺功能實現 后臺功能實現 管理員模塊實現 導游模塊實現 用戶模塊實現 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&am…

SQL server 異常 出現錯誤 824

2025-08-27 01:36:37,324 ERROR c.z.i.w.DatabaseUtils [Scheduled-7] Error executeStoredProcedure SQL script: sp_RefreshDWDByDateFive警告: 在 08 27 2025 1:36AM 出現錯誤 824。請記錄該錯誤和時間&#xff0c;并與您的系統管理員聯系。 2025-08-27 01:36:37,332 ERROR …

制造業生產線連貫性動作識別系統開發

制造業生產線連貫性動作識別系統開發 第一部分&#xff1a;項目概述與理論基礎 1.1 項目背景與意義 在現代智能制造環境中&#xff0c;盡管自動化程度不斷提高&#xff0c;但人工操作仍然在復雜裝配任務中扮演著不可替代的角色。研究表明&#xff0c;人機協作被視為打破傳統人機…

什么是Jmeter? Jmeter工作原理是什么?

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 第一篇 什么是 JMeter&#xff1f;JMeter 工作原理 1.1 什么是 JMeter Apache JMeter 是 Apache 組織開發的基于 Java 的壓力測試工具。用于對軟件做壓力測試&a…

Linux網絡基礎1(一)之計算機網絡背景

文章目錄計算機網絡背景網絡發展認識 "協議"高小琴例子方言例子計算機網絡背景 網絡發展 獨立模式: 計算機之間相互獨立; 網絡互聯: 多臺計算機連接在一起, 完成數據共享; 局域網LAN: 計算機數量更多了, 通過交換機和路由器連接在一起; 廣域網WAN: 將遠隔千里的計算…

如何在數學建模賽中實現模型創新?

模型創新性在國賽數學建模中&#xff0c;完備性是論文的基本要求&#xff0c;而創新性則是決定論文能否脫穎而出的關鍵因素。所謂創新&#xff0c;并不僅僅指提出完全新穎的數學理論&#xff0c;而是能夠在已有方法的基礎上&#xff0c;通過新的問題切入點、假設修正、模型優化…

【重磅發布】flutter_chen_updater-版本升級更新

Flutter Chen Updater 一個功能強大的Flutter應用內更新插件&#xff0c;支持Android APK自動下載、安裝和iOS跳轉App Store。 ? 特性 ? 跨平臺支持: Android APK自動更新&#xff0c;iOS跳轉App Store? 智能下載: 支持斷點續傳、文件校驗、多重備用方案? 權限管理: 自動處…

docker 1分鐘 快速搭建 redis 哨兵集群

使用 docker-compose 1 分鐘搭建好 1主2從3哨兵的 redis 哨兵集群 目錄結構 redis-sentinel-cluster ├── check_redis.sh ├── docker-compose.yml ├── redis │ └── redis.conf ├── sentinel │ └── sentinel.confdocker-compose.yml 配置 version: 3…

Git與DevOps實戰:從版本控制到自動化部署

一、版本控制1.什么是版本控制&#xff1f;版本控制用于高效追蹤和管理項目開發中的代碼、配置及文檔變更歷史&#xff0c;確保團隊成員始終使用正確版本&#xff0c;并支持版本回溯、差異比較和文件恢復。它能帶來以下優勢&#xff1a;通過歷史記錄保障數據安全與完整性&#…

大模型——利用RAG構建智能問答平臺實戰

利用RAG構建智能問答平臺實戰 目前公司的智能問答平臺利用RAG技術構建,現給大家分享下通RAG技術構建智能問平臺的具體流程和原理。 一、什么是RAG RAG是檢索增強生成技術(Retrieval-Augmented Generation),目前是構建智能問答的重要技術。RAG相比傳統的檢索可以可以減少…

flume事務機制詳解:保障數據可靠性的核心邏輯

flume事務機制詳解&#xff1a;保障數據可靠性的核心邏輯 在數據采集過程中&#xff0c;“不丟數據、不重數據” 是核心需求。Flume 之所以能在分布式環境下保證數據可靠性&#xff0c;關鍵在于其內置的事務機制。Flume 通過在 “Source → Channel” 和 “Channel → Sink” …

第四十九天(springboot模版注入ThymeleafFreemarkerVelocity)

開發框架-SpringBoot 參考&#xff1a;Spring Boot 中文文檔 新建一個spring Boot 項目&#xff0c;修改服務器url為 aliyun.com 不然沒有與jdk8版本對應的java 選擇一個spring web 庫&#xff0c;點擊創建即可 來到這個頁面點擊運行 啟動的是8080端口&#xff0c;用127.0.0.1…

Spring MVC 九大組件源碼深度剖析(六):HandlerExceptionResolver - 異常處理的藝術

文章目錄一、異常處理的核心價值二、核心接口設計三、四大內置實現類源碼解析1. ExceptionHandlerExceptionResolver&#xff08;現代異常處理核心&#xff09;2. ResponseStatusExceptionResolver&#xff08;HTTP狀態碼處理&#xff09;3. DefaultHandlerExceptionResolver&a…

MCP(Model Context Protocol,模型上下文協議)介紹

1. 背景 隨著大語言模型&#xff08;LLM, Large Language Model&#xff09;的應用越來越廣泛&#xff0c;一個核心問題逐漸凸顯&#xff1a; 模型在對話或推理時&#xff0c;往往只能依賴有限上下文窗口。外部工具、知識庫、應用接口如何統一接入模型&#xff0c;缺乏標準協議…

synchronized的鎖對象 和 wait,notify的調用者之間的關系

誰調用了wait和notify方法&#xff0c;會決定這兩個方法的控制范圍嗎&#xff1f;你的問題非常深入&#xff0c;涉及到 wait() 和 notify() 方法的控制范圍和作用域。讓我們詳細分析一下&#xff1a;? 核心概念&#xff1a;控制范圍由“鎖對象”決定wait() 和 notify() 的控制…

【技術教程】如何將文檔編輯器集成到用 .Net 編寫的網絡應用程序中

在現代網絡應用中&#xff0c;?富文本編輯能力已成為內容管理系統的核心需求。對于 .NET 開發者而言&#xff0c;選擇適合的編輯器并高效集成&#xff0c;是構建企業級應用的關鍵一步&#xff0c;可讓項目管理、 CRM 或定制化系統具備原生辦公能力&#xff0c;消除頻繁切換應用…