基于Go語(yǔ)言實(shí)現(xiàn)插入排序算法及優(yōu)化
插入排序
插入排序是一種簡(jiǎn)單的排序算法,以數(shù)組為例,我們可以把數(shù)組看成是多個(gè)數(shù)組組成。插入排序的基本思想是往前面已排好序的數(shù)組中插入一個(gè)元素,組成一個(gè)新的數(shù)組,此數(shù)組依然有序。光看文字可能不理解,讓我們看看圖示:
插入排序的時(shí)間復(fù)雜度為 O(N²)。
算法實(shí)現(xiàn)
import ( "fmt" ) func main() { nums := [4]int{4, 1, 3, 2} fmt.Println("原數(shù)組:", nums) fmt.Println("--------------------------------") InsertionSort(nums) } func InsertionSort(nums [4]int) { for i := 1; i < len(nums); i++ { for j := i; j > 0 && nums[j] < nums[j-1]; j-- { nums[j], nums[j-1] = nums[j-1], nums[j] } fmt.Printf("第 %d 輪后:%v\n", i, nums) } fmt.Println("--------------------------------") fmt.Println("排序后的數(shù)組:", nums) }
執(zhí)行結(jié)果:
原數(shù)組: [4 1 3 2]
--------------------------------
第 1 輪后:[1 4 3 2]
第 2 輪后:[1 3 4 2]
第 3 輪后:[1 2 3 4]
--------------------------------
排序后的數(shù)組: [1 2 3 4]
1.第一層循環(huán)的 i
變量,表示待排序的元素;
2.第二層循環(huán):
j
變量的初值為 i
的值,由 j
變量往前去尋找待插入的位置;
- 循環(huán)條件為
j > 0 && nums[j] < nums[j - 1]
: j > 0
→ 尋找到左邊界則結(jié)束尋找;
nums[j] < nums[j - 1]
→ 左邊元素小于待排序的元素則結(jié)束尋找;
3.循環(huán)體為元素交換邏輯,只要滿足循環(huán)條件,則不斷交換元素,直到交換到待插入的位置,才終止。
算法優(yōu)化
上面的代碼,是通過(guò)不斷地交換元素,直到無(wú)法交換,才能將元素放置到待插入的位置,為了避免頻繁交換元素而導(dǎo)致效率低,將交換的邏輯變成把前面的數(shù)往后移,最后再將待排序的元素插入到合適的位置即可。
import ( "fmt" ) func main() { nums := [4]int{4, 1, 3, 2} fmt.Println("原數(shù)組:", nums) fmt.Println("--------------------------------") InsertionSort(nums) } func InsertionSort(nums [4]int) { for i := 1; i < len(nums); i++ { t := nums[i] j := i for ; j > 0 && t < nums[j-1]; j-- { nums[j] = nums[j-1] } nums[j] = t fmt.Printf("第 %d 輪后:%v\n", i, nums) } fmt.Println("--------------------------------") fmt.Println("排序后的數(shù)組:", nums) }
用變量 t
記錄待排序的元素,用 j
變量往前查找,只要前面的數(shù)比 t
大,那么就往后移,最后將 t
插入到合適的位置。
小結(jié)
本文首先對(duì)插入排序進(jìn)行簡(jiǎn)單地介紹,通過(guò)圖片來(lái)演示插入排序的過(guò)程,然后使用 Go
語(yǔ)言實(shí)現(xiàn)插入排序的算法。為減少算法中交換次數(shù)的邏輯,對(duì)算法進(jìn)行優(yōu)化,將交換的邏輯變成把前面的數(shù)往后移,最后將待排序的數(shù)插入到合適的位置即可。
除了這種優(yōu)化方式,還有一種改造方式:普通的算法往左查找的方式是線性查找,由于元素是有序的,因此線性查找可以換成二分查找,但是經(jīng)過(guò)二分找到待插入的位置之后,也得移動(dòng)前面的元素,相比上面的優(yōu)化方法,還多了 O(logn) 的查找時(shí)間復(fù)雜度,因此我認(rèn)為沒(méi)有必要改造成二分查找。
到此這篇關(guān)于基于Go語(yǔ)言實(shí)現(xiàn)插入排序算法及優(yōu)化的文章就介紹到這了,更多相關(guān)Go語(yǔ)言插入排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go語(yǔ)言新寵:pdqsort排序算法的完美打造
- go語(yǔ)言實(shí)現(xiàn)十大常見(jiàn)的排序算法示例
- 基于Go語(yǔ)言實(shí)現(xiàn)選擇排序算法及優(yōu)化
- 基于Go語(yǔ)言實(shí)現(xiàn)冒泡排序算法
- Go語(yǔ)言實(shí)現(xiàn)常用排序算法的示例代碼
- GO語(yǔ)言中常見(jiàn)的排序算法使用示例
- Go語(yǔ)言排序算法之插入排序與生成隨機(jī)數(shù)詳解
- Go語(yǔ)言展現(xiàn)快速排序算法全過(guò)程的思路及代碼示例
- 深入解析快速排序算法的原理及其Go語(yǔ)言版實(shí)現(xiàn)
- go語(yǔ)言睡眠排序算法實(shí)例分析
- Go語(yǔ)言排序算法:快速、可靠的排序解決方案
相關(guān)文章
通過(guò)源碼分析Golang?cron的實(shí)現(xiàn)原理
golang實(shí)現(xiàn)定時(shí)任務(wù)很簡(jiǎn)單,只須要簡(jiǎn)單幾步代碼即可以完成,最近在做了幾個(gè)定時(shí)任務(wù),想研究一下它內(nèi)部是怎么實(shí)現(xiàn)的,所以將源碼過(guò)了一遍,記錄和分享在此。需要的朋友可以參考以下內(nèi)容,希望對(duì)大家有幫助2022-10-10go語(yǔ)言寫(xiě)的簡(jiǎn)要數(shù)據(jù)同步工具詳解
作為go-etl工具的作者,想要安利一下這個(gè)小巧的數(shù)據(jù)同步工具,它在同步百萬(wàn)級(jí)別的數(shù)據(jù)時(shí)表現(xiàn)極為優(yōu)異,基本能在幾分鐘完成數(shù)據(jù)同步,這篇文章主要介紹了go語(yǔ)言寫(xiě)的簡(jiǎn)要數(shù)據(jù)同步工具,需要的朋友可以參考下2024-07-07淺析Go語(yǔ)言中的方法集合與選擇receiver類(lèi)型
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中的方法集合與選擇receiver類(lèi)型的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)go語(yǔ)言有一定的幫助,需要的可以參考下2023-11-11Go實(shí)現(xiàn)快速生成固定長(zhǎng)度的隨機(jī)字符串
這篇文章主要為大家詳細(xì)介紹了怎樣在Go中簡(jiǎn)單快速地生成固定長(zhǎng)度的隨機(jī)字符串,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以學(xué)習(xí)一下2022-10-10Go語(yǔ)言字符串及strings和strconv包使用實(shí)例
字符串是工作中最常用的,值得我們專(zhuān)門(mén)的練習(xí)一下,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言字符串及strings和strconv包使用的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06