Go數據結構與算法-常見的排序算法

雖然看過別人寫了很多遍,而且自己也寫過很多遍(指的是筆記),但是還是要寫的就是排序算法。畢竟是初學Go語言,雖然之前寫過,但是還是打算再寫一遍。主要包括插入排序、選擇排序、冒泡排序、快速排序、堆排序、歸并排序。

先簡單寫下排序的思路。插入排序:每個值與前面的排序好的值比較大小,可能會交換多次;選擇排序:當前值與后面的值比較大小,記錄最小值的坐標,只交換一次;冒泡排序:兩兩比較,結果是最大的值到最后;快速排序:找分割值,小于的放小數組,大于的放大數組,再對大小數組進行快速排序;二分歸并排序:這個不斷二分,然后比較大小后歸并返回。


插入排序

不斷將當前坐標的值與前面的值比較,從最近的開始(因為是從小到大排序的)。時間復雜度是(1+...+n)=(1+n)n/2,也就是n的方,不過還不包括移動元素的時間,只是單純的比較次數。

func insertSort(arr []int) []int {length := len(arr)//每個值和前面的比較for i := 1; i < length; i++{key := arr[i]j := i-1for key < arr[j] && j >= 0{   //不斷讓元素后移arr[j+1] = arr[j]j--}arr[j+1] = key  //將最終的位置交換}return arr
}

選擇排序

選擇當前坐標及后面的值中最小值的下標,并與當前坐標的值替換。并不穩定,因為當前坐標值會大幅度的跳躍,不過和插入排序都是O(1)的空間復雜度,意味著是原地排序。

func selectSort(arr []int) []int {length := len(arr)//當前值和后面比較出最小的for i :=0; i < length-1; i++{minID := ifor j := i+1; j < length; j++{if (arr[minID] > arr[j]){minID = j}arr[i], arr[minID] = arr[minID], arr[i]}}return arr
}

冒泡排序

注意一般來說使用for是因為確定范圍,而這下面的第一層for循環是因為次數,每次for語句都能夠確定一個元素的位置。兩兩比較,結果就是最大的放在了最后面。

func bubbleSort(arr []int) []int{//思路是兩兩比較for i := 0; i < len(arr)-1; i++{  //因為只需要確定len(arr)-1個元素的位置,最后一個元素的位置就確定了flag := 0for j := 0; j < len(arr)-i-1; j++{if arr[j] > arr[j+1]{arr[j], arr[j+1] = arr[j+1], arr[j]flag = 1} }if flag == 0{return arr}} return arr
}

快速排序

實際上就是通過比較和某一值的大小,大的放該值的右邊,小的該值的放左邊。利用了直接遞歸,不過如果比較值選的不好,時間復雜度會退化成O(n的方),也就是每次只排好一個值的位置。

func quickSort(arr []int) []int{if len(arr) <= 1{return arr}//選值比較key := arr[0]left := []int{}right := []int{}for i := 1; i < len(arr); i++{if key > arr[i]{left = append(left,arr[i])}else{right = append(right,arr[i])}}left = quickSort(left)right = quickSort(right)return append(append(left,key),right...)
}

堆排序

這個并不好寫,堆本質上是一種特殊的完全二叉樹,大根堆是每個節點的值 ≥ 其子節點的值,根節點最大。小根堆則是每個節點的值 ≤ 其子節點的值,根節點最小,通常可以通過數組來實現,并且父子關系通過下標來計算。


func heapSort(arr []int) {n := len(arr)// 1. 構建大頂堆(從最后一個非葉子節點開始)for i := n/2 - 1; i >= 0; i-- {heapify(arr, n, i)}// 2. 逐個提取堆頂元素(最大值)到數組末尾for i := n - 1; i > 0; i-- {arr[0], arr[i] = arr[i], arr[0] // 交換堆頂與末尾元素heapify(arr, i, 0)              // 對剩余元素重新堆化}
}// 堆化函數:維護以 root 為根的子樹滿足大頂堆性質
func heapify(arr []int, n, root int) {largest := root     // 初始化最大值為根節點left := 2*root + 1  // 左子節點right := 2*root + 2 // 右子節點// 找出根、左、右中的最大值if left < n && arr[left] > arr[largest] {largest = left}if right < n && arr[right] > arr[largest] {largest = right}// 若最大值不是根節點,則交換并遞歸調整if largest != root {arr[root], arr[largest] = arr[largest], arr[root]heapify(arr, n, largest)}
}

歸并排序

遞歸深度可以算是logn,每次merge合并是n,時間復雜度估計是O(nlogn)。不過空間復雜度是O(n),這和遞歸沒有關系,想象一棵遞歸樹,所有葉節點的合并操作??總空間需求為?O(n)??(各層空間不疊加)。


func mergeSort(arr []int) []int{//先二分length := len(arr)if length <= 1 {return arr}mid := length/2left := mergeSort(arr[:mid])right := mergeSort(arr[mid:])return merge(left,right)
}
func merge(left []int, right []int) []int{//核心原理是不斷將小值放到前面lenght := len(left) + len(right)slice := make([]int,0,lenght)i,j := 0,0for i < len(left) && j < len(right){if left[i] < right[j]{slice = append(slice,left[i])i++}else{slice = append(slice,right[j])j++}}slice = append(slice, left[i:]...)slice = append(slice, right[j:]...)return slice
}

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

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

相關文章

第 6 篇:目標規則與負載均衡 - `DestinationRule` 詳解

系列文章:《Istio 服務網格詳解》 第 6 篇:目標規則與負載均衡 - DestinationRule 詳解 本篇焦點: 深入理解 DestinationRule 的核心作用:定義流量在到達目的地之后的行為。 詳細剖析其三大核心功能:服務子集 (Subsets), 流量策略 (Traffic Policy), TLS 設置。 動手實戰…

一個簡潔的 C++ 日志模塊實現

一個簡潔的 C 日志模塊實現 1. 引言 日志功能在軟件開發中扮演著至關重要的角色&#xff0c;它幫助開發者追蹤程序執行過程、診斷問題以及監控系統運行狀態。本文介紹一個使用 C 實現的輕量級日志模塊&#xff0c;該模塊支持多日志級別、線程安全&#xff0c;并提供了簡潔易用…

C語言---數據類型

文章目錄數據類型分類1. 基本類型 (Basic Types)a. 整數類型 (Integer Types)char (字符型)int (整型)short (短整型)long (長整型)long long (C99標準引入)圖片匯總b. 浮點類型 (Floating-Point Types)float (單精度浮點型)double (雙精度浮點型)long double (長雙精度浮點型)…

本搭建烏云漏洞庫

1.下載鏡像站文件&#xff0c;并拖入虛擬機 2.將bugs.rar解壓至網站根目錄下 /var/www/html 3.配置bugs/conn.php 4.在bugs下創建upload目錄&#xff0c;將10-14、15-a、15-b、16壓縮包文件解壓到該upload目錄 5.把wooyun.rar解壓到 /mysql/data/wooyun目錄下 6.配置hosts文件后…

Vmware虛擬機 處理器配置選項配置介紹

1. 處理器配置選項好&#x1f44c;&#xff0c;我來幫你逐一解讀 VMware 里 虛擬機處理器 這些選項的含義。 你截的圖里&#xff0c;主要有三塊內容&#xff1a; 處理器數量 每個處理器的內核數量 ©虛擬化引擎1?? 處理器數量 這是分配給虛擬機的 邏輯 CPU 插槽數。一般…

day40-tomcat

1.每日復盤與今日內容1.1復盤keepalived高可用配置搶占式與非搶占式腦裂keepalived處理Nginx掛掉1.2今日內容部署、安裝、配置tomcat(systemctl)Tomcat主配置文件部署靜態頁部署zrlog&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;接入負載均衡掛載到NFS2…

【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機的串口控制

【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機的串口控制 本文介紹了 RA-Eco-RA4E2-64PIN-V1.0 開發板通過串口指令實現 28BYJ-48 步進電機旋轉角度和速度的精確控制的項目設計。 項目介紹 硬件連接&#xff1a;28BYJ-48 步進電機、ULN2003 驅動板、Jlink 調試器、供電電源等&am…

PiscCode基于 Mediapipe 的人體多模態關鍵點檢測與可視化系統 —— HumanMultiLandmarker 深度解析

一、引言 在計算機視覺領域&#xff0c;人體關鍵點檢測&#xff08;Human Pose Estimation&#xff0c;HPE&#xff09;一直是研究和應用的熱點方向之一。隨著深度學習與實時圖像處理技術的發展&#xff0c;人體姿勢估計已經從傳統的 2D 檢測走向了 3D 空間建模&#xff0c;并…

文獻閱讀筆記【物理信息機器學習】:Physics-informed machine learning

文獻閱讀筆記&#xff1a;Physics-informed machine learningSummaryResearch ObjectiveBackground / Problem Statement問題背景研究現狀需解決的問題問題出現的原因分析問題解決思路Method(s)問題建模作者解決問題的方法/算法1. 觀測偏差&#xff08;Observational Biases&am…

Linux服務環境搭建指南

實驗拓撲概述**實驗拓撲&#xff1a; APPSRV&#xff1a; 主機名&#xff1a;appsrv.example.com ip地址&#xff1a;192.168.100.10 網關&#xff1a;192.168.100.254 網卡為NAT模式 STORAGESRV&#xff1a; 主機名&#xff1a;storagesrv.example.com ip地址&#xff1a;192.…

[特殊字符] 數據庫知識點總結(SQL Server 方向)

一、數據庫基礎概念數據庫&#xff08;Database&#xff09;&#xff1a;存儲和管理數據的容器。數據表&#xff08;Table&#xff09;&#xff1a;以行和列形式組織數據。行&#xff08;Row&#xff09;&#xff1a;一條記錄。列&#xff08;Column&#xff09;&#xff1a;字…

【PSINS工具箱】MATLAB例程,二維平面上的組合導航,EKF融合速度、位置和IMU數據,4維觀測量

文章目錄關于工具箱程序簡介代碼概述核心功能與步驟運行結果MATLAB代碼關于工具箱 本文所述的代碼需要基于PSINS工具箱&#xff0c;工具箱的講解&#xff1a; PSINS初學指導&#xff1a;https://blog.csdn.net/callmeup/article/details/137087932 本文為二維平面上的定位&am…

MiMo-VL 技術報告

摘要 我們開源了 MiMo-VL-7B-SFT 和 MiMo-VL-7B-RL 兩個強大的視覺語言模型,它們在通用視覺理解和多模態推理方面均展現出最先進的性能。MiMo-VL-7B-RL 在 40 項評估任務中的 35 項上優于 Qwen2.5-VL-7B,并在 OlympiadBench 上獲得 59.4 分,超越了參數量高達 780 億的模型。…

CTFshow Pwn入門 - pwn 19

先看main函數&#xff1a;fclose(_bss_start) fclose(stdout) 關閉了默認fd1的輸出&#xff0c;所以system的結果無法直接看到。 思路&#xff1a; 輸出重定向。 ls 1>&0 ls >&0 ls >&2 ###三種寫法均可將輸出重定向到能回顯的終端并獲得一個新的交互…

Redis(以Django為例,含具體操作步驟)

簡介Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的內存數據結構存儲系統&#xff0c;支持多種數據結構&#xff08;如字符串、哈希、列表、集合、有序集合等&#xff09;&#xff0c;可用作數據庫、緩存或消息隊列。其核心特點包括&#xff1a;高性能&am…

瀏覽器解析網址的過程

問題瀏覽器解析網址的過程我的回答當你在瀏覽器地址欄輸入一個URL&#xff08;比如www.example.com&#xff09;并按下回車后&#xff0c;會發生以下一系列步驟&#xff1a;首先&#xff0c;瀏覽器會解析URL結構&#xff0c;確定要訪問的協議、域名和路徑。如果你沒有輸入協議部…

NVIDIA Nsight Systems性能分析工具

* 性能分析 NVIDIA Nsight Systems (推薦)&#xff1a; 這是 NVIDIA 官方推薦的更現代、功能更強大的分析工具。 安裝 Nsight Systems在 Docker 容器中啟動程序&#xff1a;# 確保你在啟動容器時掛載了/usr/local/cuda/targets/x86_64-linux/lib/ 和 /usr/local/nvidia/lib64 #…

后臺管理系統-14-vue3之tag標簽頁的實現

文章目錄 1 tag靜態實現 1.1 CommonTag.vue(el-tag) 1.2 Main.vue(普通組件標簽) 2 tag通過pinia管理 2.1 CommonAside.vue(菜單點擊事件) 2.2 stores/index.js(selectMenu()和tags) 2.3 CommonTag.vue(計算屬性tags) 3 點擊tag之后跳轉到指定頁面 3.1 views/Mail.vue(商品) 3.…

CMake2: CMakeLists.txt的常用命令

參考鏈接: 愛編程的大丙 | CMake教程 CMakeLists指令以及常用方法 現代 CMake 教程 文章目錄1. cmake_minimum_required( )2. project( )3. add_executable( )4. set()5. aux_source_directory( )6. file( )7. include_directories( )8. add_library( )9. link_libraries()與li…

Ansible入門:自動化運維基礎

Ansible 基礎概念與安裝1. 自動化動機 (Motivation for Automation)概念解釋&#xff1a; 指為什么要用Ansible等工具來替代手動管理服務器。核心動機包括&#xff1a;效率與速度&#xff1a; 同時在上百甚至上千臺服務器上執行任務&#xff0c;秒級完成&#xff0c;遠非人工可…