插入排序
代碼如下?
package main
import "fmt"
func main() {
? ? a := []int{4, 5, 6, 1, 3, 2}? ??
? ? b := insert(a)
? ? for i := 0; i < len(b); i++ {
? ? ? ? fmt.Println(b[i])
? ? }
}文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-476487.html
func insert(a []int) []int {
? ? if len(a) <= 1 {? ? ? ? ? ? ? ? ? ?如果數(shù)組長(zhǎng)度小于等于1 不用排序直接返回?
? ? ? ? return a
? ? }
? ? for i := 1; i < len(a); i++ {? ? 遍歷數(shù)組,確定要重新插入的元素,從第2個(gè)元素開(kāi)始,一直到最后一個(gè)元素?
? ? ? ? value := a[i]? ? ? ? ? ? 記錄要插入元素的值?
? ? ? ? j := i - 1? ? ? ? ? ? ? ? ? ? 而j表示的是插入位置,插入位置從i的前一個(gè)位置開(kāi)始?
? ? ? ? for ; j >= 0; j-- {? ? ? 遍歷j尋找插入位置
? ? ? ? ? ? if a[j] > value {? 如果當(dāng)前j位置的元素大于記錄的元素,說(shuō)明該位置不是要插入的位置,需要將j往前移動(dòng),但在移動(dòng)j之前,需要將a[j]的值向后移動(dòng),以騰出插入位置
? ? ? ? ? ? ? ? a[j+1] = a[j]
? ? ? ? ? ? } else {? ? ? ? ?如果當(dāng)前j的值小于valuel,說(shuō)明j+1這個(gè)位置就是該元素的插入位置 ,找到插入位置中斷循環(huán)?
? ? ? ? ? ? ? ? break
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? a[j+1] = value
? ? }
? ? return a文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-476487.html
}
冒泡排序
代碼如下
package main
import "fmt"
func main() {
? ? a := []int{8, 2, 3, 1, 9, 6}
? ? b := bubble(a)
? ? for i := 0; i < len(b); i++ {
? ? ? ? fmt.Println(b[i])
? ? }
}
func bubble(a []int) []int {
? ? if len(a) <= 1 {
? ? ? ? return a
? ? }
? ? for i := 0; i < len(a); i++ {? ? ? i表示已經(jīng)排序好元素的個(gè)數(shù)?
? ? ? ? flag := false? ? ? ? ? ? ? 設(shè)置一個(gè)標(biāo)志位,來(lái)記錄每一輪排序是否有元素交換?
? ? ? ? for j := 0; j < len(a)-i-1; j++ {? ? ? j表示需要進(jìn)行排序的元素,從第一個(gè)元素,到len(a)-i-1,當(dāng)每排完一輪,需要排序的元素的最終下標(biāo)就會(huì)往前移動(dòng)?
? ? ? ? ? ? if a[j] > a[j+1] {? ? ? ? ? ? 比較前后兩個(gè)元素的大小,如果前面的元素大于后面的元素則進(jìn)行交換?
? ? ? ? ? ? ? ? a[j], a[j+1] = a[j+1], a[j]
? ? ? ? ? ? ? ? flag = true? ? ? ? ? ? ?如果發(fā)生交換,則把標(biāo)志位置為true?
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if !flag {? ? 如果這一輪沒(méi)有發(fā)生交換,則說(shuō)明已經(jīng)排好序了,就可以進(jìn)行break了?
? ? ? ? ? ? break
? ? ? ? }
? ? }
? ? return a
}
選擇排序
代碼如下
package main
import "fmt"
func main() {
? ? a := []int{8, 2, 3, 1, 9, 6}
? ? b := xuanze(a)
? ? for i := 0; i < len(b); i++ {
? ? ? ? fmt.Println(b[i])
? ? }
}
func xuanze(a []int) []int {
? ? if len(a) <= 1 {
? ? ? ? return a
? ? }
? ? for i := 0; i < len(a)-1; i++ {? ?i表示前i個(gè)元素已經(jīng)排序好了,如i=2 ,則說(shuō)明有兩個(gè)元素已經(jīng)排序好了,那么此時(shí)未排序的下標(biāo)則為i?
? ? ? ? minindex := i? ?取未排序的開(kāi)始下標(biāo)作為最小下標(biāo)的初始值?
? ? ? ? for j := i + 1; j < len(a); j++ {? ?j取未排序開(kāi)始下標(biāo)的后一個(gè),避免重復(fù)?
? ? ? ? ? ? if a[minindex] > a[j] {? ? ? ? 遍歷未排序的數(shù)組部分,找到最小值,并將這個(gè)值所對(duì)應(yīng)的下標(biāo)定義為最小下標(biāo)
? ? ? ? ? ? ? ? minindex = j??
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? a[i], a[minindex] = a[minindex], a[i]? ?交換最小下標(biāo)和未排序的開(kāi)始下標(biāo)。注 :i作為下標(biāo)表示未開(kāi)始排序的數(shù)組的第一個(gè)元素,也是排序完成部分的后一個(gè)元素 ,這樣交換,確保將未排序的最小值放在了排序完成元素的后一個(gè)位置?
? ? }
? ? return a
}
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)算法練習(xí) 插入排序 冒泡排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!