Golang排序和查找使用方法介紹
排序的介紹
排序是將一組數(shù)據(jù),依指定的順序進(jìn)行排列的過(guò)程。
排序的分類:
1.內(nèi)部排序:
指將需要處理的所有數(shù)據(jù)都加載到內(nèi)部存儲(chǔ)器中進(jìn)行排序。
包括(交換式排序法,選擇式排序法和插入式排序法);
2.外部排序法
數(shù)據(jù)量過(guò)大,無(wú)法全部加載到內(nèi)存中,需要借助外部存儲(chǔ)進(jìn)行排序。包括(合并排序法和直接合并排序法)。
交換式排序法
交換式排序?qū)儆趦?nèi)部排序法,是運(yùn)用數(shù)據(jù)值比較后,依判斷規(guī)則對(duì)數(shù)據(jù)位置進(jìn)行交換,以達(dá)到排序的目的。
交換排序法又可分為兩種:
1.冒泡排序法(Bubble sort)
2.快速排序法(Quick sort)
交換式排序法-冒泡排序法
冒泡排序(Bubble Sorting)的基本思想是:通過(guò)對(duì)待排序序列從后向前(從下標(biāo)較大的元素開(kāi)始),依次比較相鄰元素的排序碼,若發(fā)現(xiàn)逆序則交換,使排序碼較小的元素逐漸從后部移向前部(從下標(biāo)較大的單位移向下標(biāo)較小的單元),就像水底下的氣泡一樣逐漸向上冒。
因?yàn)榕判虻倪^(guò)程中,各元素不斷接近自己的位置,如果一趟比較下來(lái)沒(méi)有進(jìn)行過(guò)交換,就說(shuō)明序列有序,因此要在排序過(guò)程中設(shè)置一個(gè)標(biāo)志flag判斷是否進(jìn)行過(guò)交換。從而減少不必要的比較(優(yōu)化)。
// 冒泡排序 func BubbleSort(arr *[5]int){ fmt.Println("排序前arr=",(*arr)) temp := 0 // 冒泡排序 for i:=0;i<len(*arr)-1;i++{ for j:=0;j<len(*arr)-1-i;j++{ if(*arr)[j] > (*arr)[j+1]{ // 交換 temp = (*arr)[j] (*arr)[j] = (*arr)[j+1] (*arr)[j + 1] = temp } } } fmt.Println("排序后arr=",(*arr)) }
查找
//順序查找:方式一 for i := 0;i<len(names);i++{ if heroName == names[i]{ fmt.Printf("找到%v,下標(biāo)%v \n",heroName,i) }else if i==(len(names)-1){ fmt.Printf("沒(méi)有找到%v \n",heroName) } } // 順序查找:方式二 index := -1 for i := 0;i<len(names);i++{ if heroName == names[i]{ index = i } } if index != -1{ fmt.Printf("找到%v,下標(biāo)%v \n",heroName,index) }else{ fmt.Println("沒(méi)有找到",heroName) }
二分查找代碼實(shí)現(xiàn)
func BinaryFind(arr *[6]int,leftIndex int,rightIndex int,findval int){ // 判斷l(xiāng)eftIndex 是否大于 rightIndex if leftIndex > rightIndex{ fmt.Println("找不到") return } // 先找到 中間的下標(biāo) middle := (leftIndex + rightIndex)/2 if(*arr)[middle] > findVal{ // 說(shuō)明我們要查找的數(shù),應(yīng)該在 leftIndex --- middle-1 BinaryFind(arr,leftIndex,middle-1,findVal) }else if(*arr)[middle] < findVal{ // 說(shuō)明我們要查找的數(shù),應(yīng)該在 middle+1 --- rightIndex BinaryFind(arr,leftIndex,middle-1,findVal) }else{ // 找到了 fmt.Printf("找到了,下標(biāo)為%v \n",middle) } }
二維數(shù)組的介紹
多維數(shù)組我們只介紹二維數(shù)組
二維數(shù)組的應(yīng)用場(chǎng)景
比如我們開(kāi)發(fā)一個(gè)五子棋游戲,棋盤(pán)就是需要二維數(shù)組來(lái)表示。
二維數(shù)組快速入門(mén)
快速入門(mén)案例:
請(qǐng)使用二維數(shù)組輸出如下圖形
func main(){ // 定義、聲明一個(gè)數(shù)組 var arr [4][6]int // 賦初值 arr[1][2]=1 arr[2][1]=2 arr[2][3]=3 // 遍歷二維數(shù)組,按照要求輸出圖形 for i :=0;i<4;i++{ for j:=0;j<6;j++{ fmt.Print(arr[i][j],"") } fmt.Println() } }
使用方法1:先聲明/定義,再賦值
1.語(yǔ)法:var 數(shù)組名 【大小】【大小】類型
2.比如:var arr [2][3]int,再賦值
3.使用演示
4.二維數(shù)組在內(nèi)存中存在形式
使用方式2:直接初始化
聲明:var 數(shù)組名【大小】【大小】類型 = 【大小】【大小】類型{{初始值…},{初始值…}}
賦值(有默認(rèn)值,比如int 類型的就是0)
使用演示:
var arr3 [2][3]int = [2][3]int{{1,2,3},{4,5,6}} fmt.Println("arr3=",arr3)
二維數(shù)組的使用
二維數(shù)組的遍歷
雙層for循環(huán)完成遍歷
func main(){ // 演示二維數(shù)組的遍歷 var arr3 = [2][3]int{{1,2,3},{4,5,6}} // for循環(huán)來(lái)遍歷 for i := 0;i<len(arr3);i++{ for j:=0;j<len(arr3[i];j++){ fmt.Printf("%v\t",arr3[i][j]) } fmt.Println() } // for-range來(lái)遍歷二維數(shù)組 for i,v := range arr3{ for j,v2 := range v{ fmt.Printf("arr3[%v][%v]=%v \t",i,j,v2) } fmt.Println() } }
for-range方式完成遍歷
func main(){ // 演示二維數(shù)組的遍歷 var arr3 = [2][3]int{{1,2,3},{4,5,6}} // for循環(huán)來(lái)遍歷 for i := 0;i<len(arr3);i++{ for j:=0;j<len(arr3[i];j++){ fmt.Printf("%v\t",arr3[i][j]) } fmt.Println() } // for-range來(lái)遍歷二維數(shù)組 for i,v := range arr3{ for j,v2 := range v{ fmt.Printf("arr3[%v][%v]=%v \t",i,j,v2) } fmt.Println() } }
二維數(shù)組的應(yīng)用案例
定義二維數(shù)組,用于保存三個(gè)班,每個(gè)班五名同學(xué)成績(jī),求出每個(gè)班級(jí)平均分,以及所有班級(jí)平均分
func main(){ // 定義一個(gè)二維數(shù)組 var scores [3][5]float64 // 循環(huán)的輸入成績(jī) for i:=0;i<len(scores);i++{ for j:=0;j<len(scores[i]);j++{ fmt.Printf("請(qǐng)輸入第%d班的第%d個(gè)學(xué)生的成績(jī)\n",i+1,j+1) fmt.Scanln(&scores[i][j]) } } // 遍歷輸出成績(jī)后的二維數(shù)組,統(tǒng)計(jì)平均分 totalSum := 0.0 //定義一個(gè)變量,用于積累所有班級(jí)的總分 for i := 0;i<len(scores);i++{ sum := 0.0 // 定義一個(gè)變量,用于累積各個(gè)班級(jí)的總分 for j := 0; j<len(scores[i]);j++{ sum += scores[i][j] } totalSum += sum fmt.Printf("第%d班級(jí)的總分為%v,平均分為%v\n",i+1,sum,sum/float64(len(scores[i]))) } fmt.Printf("所有班級(jí)的總分為%v,所有班級(jí)的平均分為%v\n",totalSum ,totalSum/15) }
到此這篇關(guān)于Golang排序和查找使用方法介紹的文章就介紹到這了,更多相關(guān)Golang排序和查找內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang學(xué)習(xí)之反射機(jī)制的用法詳解
反射的本質(zhì)就是在程序運(yùn)行的時(shí)候,獲取對(duì)象的類型信息和內(nèi)存結(jié)語(yǔ)構(gòu),反射是把雙刃劍,功能強(qiáng)大但可讀性差。本文將詳細(xì)講講Golang中的反射機(jī)制,感興趣的可以了解一下2022-06-06golang實(shí)現(xiàn)微信支付v3版本的方法
這篇文章主要介紹了golang實(shí)現(xiàn)微信支付v3版本的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Go gin權(quán)限驗(yàn)證實(shí)現(xiàn)過(guò)程詳解
這篇文章主要為大家介紹了Go gin權(quán)限驗(yàn)證實(shí)現(xiàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Go語(yǔ)言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12golang中range在slice和map遍歷中的注意事項(xiàng)
今天小編就為大家分享一篇關(guān)于golang中range在slice和map遍歷中的注意事項(xiàng),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04使用golang在windows上設(shè)置全局快捷鍵的操作
最近在工作中,總是重復(fù)的做事,想著自己設(shè)置一個(gè)快捷鍵實(shí)現(xiàn)windows 剪貼板的功能,所以本文小編給大家分享了使用golang在windows上設(shè)置全局快捷鍵的操作,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-02-02Go初學(xué)者踩坑之go?mod?init與自定義包的使用
go?mod是go的一個(gè)模塊管理工具,用來(lái)代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于Go初學(xué)者踩坑之go?mod?init與自定義包的使用,需要的朋友可以參考下2022-10-10Golang實(shí)現(xiàn)JWT身份驗(yàn)證的示例詳解
JWT(JSON Web Token)是一種開(kāi)放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用間安全地傳輸聲明,本文主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)JWT身份驗(yàn)證的相關(guān)方法,希望對(duì)大家有所幫助2024-03-03Go語(yǔ)言實(shí)現(xiàn)支付寶支付與退款詳解
本文詳細(xì)介紹使用Go語(yǔ)言對(duì)接支付寶支付與退款功能的步驟和注意事項(xiàng),包括PC端、WAP端和Android端支付實(shí)現(xiàn),以及退款功能的代碼實(shí)現(xiàn),介紹了GoPay庫(kù)的使用,幫助開(kāi)發(fā)者快速集成支付寶支付到應(yīng)用中2024-10-10