go语言入门七 | 青训营笔记

91 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

排序

分类

内部排序、外部排序 稳定排序、不稳定排序

  1. 内部排序、外部排序
    2. 内部排序是指整个排序过程完全在内存中进行,包括(交换式排序、选择式排序和插入式排序) 3. 由于数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成,包括(合并排序法和直接合并排序法)
  2. 稳定排序、不稳定排序
    1. 稳定排序:排序前后两个相等的数相对位置不变,则算法稳定
    2. 非稳定排序:排序前后两个相等的数相对位置发生了变化,则算法不稳定

交换排序

通过两两比较待排序记录的关键字,若有不满足次序要求的一对数据则交换,直到全部满足位置

1、冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

  • 双层for循环实现,时间复杂度O(n^2),空间复杂度O(1)
func BubbleAsort(values []int) {
    for i := 0; i < len(values)-1; i++ {
        a := 0
        for j := i+1; j < len(values); j++ {
            if  values[i]>values[j]{
                values[i],values[j] = values[j],values[i]    //和python一样直接交换
				a = 1
            }
        }
        if a ==0{
            return
        }
    }
    fmt.Println(values)
}

2、快速排序 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用

  • 1.先从数列中取出一个数作为基准数。
  • 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  • 3.再对左右区间重复第二步,直到各区间只有一个数。

查找

按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止。

二分查找

在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

func BinaryFind(arr *[6]int,lef int,rig int,find int){
    //数组是值传递,需要使用指针可以改变

    //判断是否在数组的范围中
    if lef > rig{
        fmt.Println("找不到")   //注意递归调用符合进站顺序,所以
        return
    }
    middle := (lef + rig) /2
    if(*arr)[middle] > find{
        //大于要查找的数,此时应该向左边找
        BinaryFind(arr,lef,middle - 1)
        //注意,此时arr本身就是指针,所以不需要地址符
    }else if (*arr)[middle] < find{
        BinaryFind(arr,middle+1,rig)
    }else{
        //相等说明找到
        fmt.Printf("找好了,下标为%v \n",middle)
    }
}
func main(){
    arr := [6]int{1,2,3,4,5,6,7,8,9}
    BinaryFind(&arr,0,len(arr)-1,4)
}