数据结构算法练习 插入排序 冒泡排序

插入排序

代码如下 

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])

    }

}

func insert(a []int) []int {

    if len(a) <= 1 {                   如果数组长度小于等于1 不用排序直接返回 

        return a

    }

    for i := 1; i < len(a); i++ {    遍历数组,确定要重新插入的元素,从第2个元素开始,一直到最后一个元素 

        value := a[i]            记录要插入元素的值 

        j := i - 1                    而j表示的是插入位置,插入位置从i的前一个位置开始 

        for ; j >= 0; j-- {      遍历j寻找插入位置

            if a[j] > value {  如果当前j位置的元素大于记录的元素,说明该位置不是要插入的位置,需要将j往前移动,但在移动j之前,需要将a[j]的值向后移动,以腾出插入位置

                a[j+1] = a[j]

            } else {         如果当前j的值小于valuel,说明j+1这个位置就是该元素的插入位置 ,找到插入位置中断循环 

                break

            }

        }

        a[j+1] = value

    }

    return a

}

冒泡排序

代码如下

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表示已经排序好元素的个数 

        flag := false              设置一个标志位,来记录每一轮排序是否有元素交换 

        for j := 0; j < len(a)-i-1; j++ {      j表示需要进行排序的元素,从第一个元素,到len(a)-i-1,当每排完一轮,需要排序的元素的最终下标就会往前移动 

            if a[j] > a[j+1] {            比较前后两个元素的大小,如果前面的元素大于后面的元素则进行交换 

                a[j], a[j+1] = a[j+1], a[j]

                flag = true             如果发生交换,则把标志位置为true 

            }

        }

        if !flag {    如果这一轮没有发生交换,则说明已经排好序了,就可以进行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个元素已经排序好了,如i=2 ,则说明有两个元素已经排序好了,那么此时未排序的下标则为i 

        minindex := i   取未排序的开始下标作为最小下标的初始值 

        for j := i + 1; j < len(a); j++ {   j取未排序开始下标的后一个,避免重复 

            if a[minindex] > a[j] {        遍历未排序的数组部分,找到最小值,并将这个值所对应的下标定义为最小下标

                minindex = j  

            }

        }

        a[i], a[minindex] = a[minindex], a[i]   交换最小下标和未排序的开始下标。注 :i作为下标表示未开始排序的数组的第一个元素,也是排序完成部分的后一个元素 ,这样交换,确保将未排序的最小值放在了排序完成元素的后一个位置 

    }

    return a

}

你可能感兴趣的:(算法,数据结构)