go語言數據結構與排序算法

package mainimport "fmt"func main() {Bubble_Sort()Select_Sort()Insert_Sort()Shell_Sort()Heap_Sort()Merge_Sort()Quick_Sort()
}

一、

1、冒泡排序?

// 冒泡排序
func Bubble_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}// 正向冒泡for i := 0; i < len(str)-1; i++ {for j := 1; j <= len(str)-1; j++ {if str[j-1] > str[j] {str[j-1], str[j] = str[j], str[j-1]}}}// 反向冒泡for i := 0; i < len(str)-1; i++ {for j := len(str) - 1; j > i; j-- {if str[j-1] > str[j] {str[j-1], str[j] = str[j], str[j-1]}}}//改進for i := 0; i < len(str)-1; i++ {flag := falsefor j := 1; j <= len(str)-1; j++ {if str[j-1] > str[j] {str[j-1], str[j] = str[j], str[j-1]flag = true}}if !flag {break}}fmt.Println(str)
}

2、快速排序

func Quick_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}Quicking_Sort(str, 0, 8)fmt.Println(str)
}
func Quicking_Sort(str []int, low, high int) {if low < high {pivot := Partition_1(str, low, high)Quicking_Sort(str, low, pivot-1)Quicking_Sort(str, pivot+1, high)}
}func Partition_0(str []int, low, high int) int {//選取基準點。也可以從三個數或者九個數中選取大小為中間值的數作為基準pivotkey := str[low]for low < high { //從表的兩端交替向中間掃描for low < high && str[high] > pivotkey {high--}//1、交換法//str[low], str[high] = str[high], str[low]for low < high && str[low] < pivotkey {low++}//1、交換法//str[low], str[high] = str[high], str[low]//2、統一交換str[low], str[high] = str[high], str[low]}return low
}func Partition_1(str []int, low, high int) int {//選取基準點。也可以從三個數或者九個數中選取大小為中間值的數作為基準pivotkey := str[low]temp := pivotkeyfor low < high { //從表的兩端交替向中間掃描for low < high && str[high] > pivotkey {high--}//替換法str[low] = str[high]for low < high && str[low] < pivotkey {low++}//替換法str[high] = str[low]}str[low] = tempreturn low
}func Partition_2(str []int, low, high int) int {pivotkey := str[high] // 選擇最后一個元素作為基準值i := lowfor j := low; j < high; j++ {// 將比 pivot 小的數丟到 [l...i-1] 中,剩下的 [i...j] 區間都是比 pivot 大的if str[j] < pivotkey {// 互換 i、j 下標對應數據str[i], str[j] = str[j], str[i]// 將 i 下標后移一位i++}}// 最后將 pivot 與 i 下標對應數據值互換// 這樣一來,pivot 就位于當前數據序列中間,i 也就是 pivot 值對應的下標str[i], str[high] = pivotkey, str[i]// 返回 i 作為 pivot 分區位置return i
}

二、

1、選擇排序?

// 選擇排序
func Select_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i := 0; i < len(str)-1; i++ {// 未排序區間最小值初始化為第一個元素min := i// 從未排序區間第二個元素開始遍歷,直到找到最小值for j := i + 1; j <= len(str)-1; j++ {if str[min] > str[j] {min = j}}// 將最小值與未排序區間第一個元素互換位置(等價于放到已排序區間最后一個位置)if min != i {str[min], str[i] = str[i], str[min]}}fmt.Println(str)
}

2、堆排序??

//堆排序
func Heap_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}//構建一個大頂堆for i := len(str) / 2; i > 0; i-- {Heap_Adjust_2(str, len(str), i)}for i := len(str) - 1; i > 0; i-- {str[0], str[i] = str[i], str[0]Heap_Adjust_2(str, i, 0) //將剩余的重新調整為大頂堆}fmt.Println(str)
}//堆調整函數0
func Heap_Adjust_0(str []int, length, index int) {temp := str[index]for j := 2*index + 1; j <= length-1; j *= 2 { //沿關鍵字較大的孩子節點向下篩選if j < length-1 && str[j] < str[j+1] {j++ //j記錄孩子節點較大的下標}if temp > str[j] { //父節點大于孩子節點break}str[index] = str[j] //給節點賦值index = j           //index此時已代表孩子節點下標}str[index] = temp //給孩子節點賦值,到此代表節點的值跟孩子節點中的較大值進行互換完成}//堆調整函數1
func Heap_Adjust_1(str []int, length, index int) {parent := indexchild := parent*2 + 1for ; child <= length-1; child *= 2 {if child < length-1 && str[child+1] > str[child] {child++}if str[child] > str[parent] {str[child], str[parent] = str[parent], str[child]parent = child}}
}//堆調整函數2
func Heap_Adjust_2(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)}
}

三、

1、插入排序

//插入排序
func Insert_Sort() {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(str)
}

2、希爾排序

//希爾排序   與插入排序比較,把原來按順序變成了相隔增量
func Shell_Sort() {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]}//如果是從for循環走到這里,此時j<0,因為for循環走完時j-=increment ,所以要加回來//走到這里時,j已經減掉increment 了,所以要加回來str[j+increment] = key}}fmt.Println(str)
}

四、歸并排序?

// 歸并排序
func Merge_Sort() {str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}str = Merging_Sort(str)fmt.Println(str)
}
func Merging_Sort(str []int) []int {// str := []int{9, 1, 5, 8, 3, 7, 4, 6, 2}if len(str) <= 1 {return str}mid := len(str) / 2 //獲取分區位置//進行遞歸分區left := Merging_Sort(str[:mid])right := Merging_Sort(str[mid:])res := Merge_0(left, right) //函數將兩個有序數組合并成一個有序數組return res
}func Merge_0(left, right []int) []int {// 用于存放結果集result := make([]int, len(left)+len(right))i, j, k := 0, 0, 0for ; k < len(result); k++ {// 任何一個區間遍歷完,則退出if i >= len(left) || j >= len(right) {break}// 對所有區間數據進行排序if left[i] < right[j] {result[k] = left[i]i++} else {result[k] = right[j]j++}}// 如果左側區間還沒有遍歷完,將剩余數據放到結果集if i <= len(left) {for l := 0; l < len(left)-i; l++ {result[k+l] = left[i+l]}}// 如果右側區間還沒有遍歷完,將剩余數據放到結果集if j <= len(right) {for l := 0; l < len(right)-j; l++ {result[k+l] = right[j+l]}}return result
}func Merge_1(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 {result[k] = right[j]j++}}return result
}func Merge_2(left, right []int) []int {// result := make([]int, len(left)+len(right))//此處不能用make初始化[]int切片,//因為make初始化后,result=[]int{0,0,0},再用append,result=[]int{0,0,0,5},//相當于直接在result后面添加數據,會導致結果多了很多0var result []intfor len(left) > 0 || len(right) > 0 {if len(left) == 0 {return append(result, right...)}if len(right) == 0 {return append(result, left...)}if left[0] < right[0] {result = append(result, left[0])left = left[1:]} else {result = append(result, right[0])right = right[1:]}}return result
}

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

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

相關文章

Petalinux生成文件的關系

1. 生成文件概述BOOT.BIN是引導程序&#xff0c;包括了 u-boot.elf是build u-boot生成的zynq_fsbl.elf&#xff08;引導PS和PL的啟動&#xff09;elf文件是和啟動引導相關的文件image.ub是鏡像文件roofs.cpio.gz用來構建根文件系統

MongoDB的操作

在 Java 中操作 MongoDB 的 增刪改查&#xff08;CRUD&#xff09; 主要有兩種方式&#xff1a; Spring Data MongoDB&#xff08;推薦&#xff0c;類似 JPA 風格&#xff09;MongoDB Java Driver&#xff08;原生 API&#xff0c;更靈活&#xff09;1. Spring Data MongoDB 方…

getConnectionOwnerUid

在Android系統中&#xff0c;為了進行網絡權限控制、流量統計等&#xff0c;需要將網絡連接&#xff08;如Socket&#xff09;與發起該連接的應用UID關聯起來。這種關聯通常在內核中建立&#xff0c;并在用戶空間通過一些接口進行查詢。 1. 內核中的實現基礎 Linux內核中&#…

開源 Arkts 鴻蒙應用 開發(十)通訊--Http數據傳輸

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

net8.0一鍵創建支持(RabbitMQ)

Necore項目生成器 - 在線創建Necore模板項目 | 一鍵下載 RabbitMQController.cs using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; using System.Threading.Tasks; using UnT.Tem…

Rust 泛型與特性

Rust 泛型與特性 引言 Rust 語言以其安全性和高效性在編程語言中獨樹一幟。Rust 的泛型和特性是其核心特性之一,它們使得開發者能夠編寫更加通用、靈活且安全的代碼。本文將深入探討 Rust 中的泛型和特性,包括其概念、用法以及在實際開發中的應用。 泛型簡介 概念 泛型是…

LangChain學習——結構化輸出和數據解析

LangChain 本指南全面介紹LangChain中結構化輸出生成和數據解析的核心功能&#xff0c;包括Pydantic BaseModel構造、各種輸出解析器的使用&#xff0c;以及高級錯誤處理機制。 詳細測試樣例和代碼可參考如下兩個鏈接&#xff1a; test_output_parserstest_pydantic_base_mo…

基于華為ENSP的BGP的狀態機深入淺出

本篇技術博文摘要 &#x1f31f; 本文章主要探討BGP狀態機如何控制BGP連接的建立與維護&#xff0c;以及BGP協議在運行過程中如何交換路由信息并確保網絡的穩定性 引言 &#x1f4d8; 在這個快速發展的技術時代&#xff0c;與時俱進是每個IT人的必修課。我是腎透側視攻城獅&…

Android 15中的16KB大頁有何優勢?

deepseek回答&#xff1a; Android 15引入的16KB大內存頁是系統性能優化的關鍵變革&#xff0c;其核心優勢體現在以下方面&#xff1a; ? 一、性能全面提升 系統整體加速 配置16KB頁面的設備整體性能提升5%-10%&#xff0c;通過減少內存管理開銷釋放更多資源用于應用運行。…

Gis數據的A*算法規劃航線

1.1 用到的技術棧geotools JTSJgrapht1.2 實現思路// 定義柵格網格參數private static final double CELL_SIZE_DEGREES 0.005;private static int gridWidth 0;//格子高度 index 1private static int gridHeight 0;//格子寬度// 1. 讀取GeoJSON文件File geoJsonFile new …

Spring Boot 默認使用 CGLIB,但CGLIB 無法代理 final 類或 final 方法

那么當這兩件事沖突時&#xff0c;Spring Boot 是怎么“解決”的呢&#xff1f;答案是&#xff1a;它不解決&#xff0c;也無法解決。當這種情況發生時&#xff0c;你的應用程序會直接啟動失敗。這不是 Spring Boot 的疏忽&#xff0c;而是由 CGLIB 的底層原理和 Java 語言的規…

cuda編程筆記(10)--memory access 優化

全局內存訪問優化&#xff08;Coalesced Access&#xff09; 什么是 Coalesced Access&#xff1f; 定義&#xff1a;一個 warp&#xff08;32 個線程&#xff09;在同一指令中訪問全局內存時&#xff0c;如果這些訪問請求可以合并成盡可能少的內存事務&#xff08;通常是 32…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第三十一課——車牌識別的FPGA實現(3)車牌字符分割預處理

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

電子電氣架構 --- 汽車軟件全生命周期

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

力扣面試150(41/150)

7.25 56. 合并區間 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 我的思路&#xff1a; 左端點升序…

【隧道篇 / IPsec】(7.6) ? 01. 利用向導快速建立IPsec安全隧道 (點對點) ? FortiGate 防火墻

【簡介】相信很多人已經習慣利用導向快速創建VPN了&#xff0c;而且已經有部分嘗鮮者已經用上了FortiOS 7.6&#xff0c;但是會發現FortiOS 7.6下的VPN向導改變了很多&#xff0c;一時無法下手&#xff0c;下面我們來看看最常見的點對點是如何配置的。環境介紹在配置IPsec VPN之…

PLLIP核

。1 號紅色框內的速度等級代表著設備的速度 等級&#xff0c;保存默認就好&#xff1b;2 號紅色框內設置輸入頻率&#xff1b;3 號紅色框選擇 PLL 的工作模式。我們 開發板用的晶振是 50MHz 的&#xff0c;故在 2 號紅色框內我們填寫 50MHz&#xff1b;我們在 3 號紅色框內選正…

1.1 Deep learning?pytorch ?深度學習訓練出來的模型通常有效但無法解釋合理性? 如何 解釋?

DL 是什么&#xff0c;你如何理解DL模型&#xff1f; DL 對于我而言&#xff0c;就是人類試圖想通過數學語言描述人類學習過程的一門技術&#xff0c;或者說學科。 因此 DL 模型 相當于 數學 的 一個 funciton &#xff0c;有輸入&#xff0c;通過function處理&#xff0c;得…

java實現在工具類中注入其他對象方式

方案1&#xff1a; Slf4j Component public class ChatdocApiClient {Value("${chatdoc.app-id}")private String appId;Value("${chatdoc.secret}")private String secret;Value("${chatdoc.domain}")private String domain;private final Rest…

electron中IPC 渲染進程與主進程通信方法解析

electron中ipcRenderer.invoke、ipcRenderer.on、ipcRenderer.send、ipcRenderer.sendSync作用與區別 IPC 渲染進程與主進程通信方法解析 ipcRenderer 的這幾個方法作用不完全相同&#xff0c;它們適用于不同的通信場景&#xff0c;核心區別在于通信方向、是否需要響應以及同步…