Go语言学习之排序算法(选择、插入、冒泡)|Go主题月

449 阅读2分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之常量和常量生成器|Go主题月

  • 常量
  • 常量生成器

本篇内容将继续带领大家走进Go语言的世界。

1.本文简介

Go语言学习之排序算法(选择、插入、冒泡)

2.选择排序

选择排序是一种直观的排序算法,基本原理如下:对于给定的一组数组,经过第一轮比较后得到一个最小的值,然后将该值与数组的第一个值的位置进行交换,接着对不包括第一个值以外的值进行第二轮比较,得到最小的值并与数组中第二个值进行交换。不断重复该过程,直到进行比较的值只有一个时为止。

以数组[3,5,7,0,1] 为例,说明一下选择排序的过程。

  • 第一轮排序后:0,[3,5,7,1]
  • 第二轮排序后:0,1,[3,5,7]
  • 第三轮排序后:0,1,3,[5,7]
  • 第四轮排序后:0,1,3,5,[7]
  • 最后的排序结果为:0,1,3,5,7

具体代码如下所示:

package main

import "fmt"

func Select(data []int) {
   llen:=len(data)
   for i:=0;i<llen;i++{
      tmp:=data[i]
      flag:=i
      for j:=i+1;j<llen;j++{
         if data[j]<tmp{
            tmp=data[j]
            flag=j
         }
      }
      if flag!=i{
         data[flag]=data[i]
         data[i]=tmp
      }
   }
   }

func main(){
   data:=[]int{1,5,3,8,0}
   Select(data)
   fmt.Printf("{1,5,3,8,0}选择排序的输出为:%v",data)

}

输出为

image.png

3.插入排序

插入排序的基本原理如下:对于一组给定的数组,初始时假设第一个值自成一个有序序列,其余的值为无序序列。接着从第二个值开始,按照值的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个值插入到有序序列中为止。

以数组[3,5,7,0,1]为例,说明一下插入排序的过程。

  • 第一步插入3以后:[3],5,7,0,1
  • 第二步插入5以后:[3,5],7,0,1
  • 第三步插入7以后:[3,5,7],0,1
  • 第四步插入0以后:[0,3,5,7],1
  • 第五步插入1以后:[0,1,3,5,7]

具体代码如下所示:

package main

import "fmt"

func Insert(array []int){
   if array==nil{
      return
   }
   for i:=1;i<len(array);i++{
      tmp,j:=array[i],i
      if array[j-1]>tmp{
         for j>=1&&array[j-1]>tmp{
            array[j]=array[j-1]
            j--
         }
      }
      array[j]=tmp
   }
}

func main(){
   array:=[]int{1,5,3,8,0}
   Insert(array)
   fmt.Printf("{1,5,3,8,0}插入排序的输出为:%v",array)

}

输出为

image.png

4.冒泡排序

冒泡排序顾名思义,指的是排序的整个过程像气泡一样上升,单向冒泡排序的基本思想是(假设由小到大排序):对于给定的n个值,从第一个值开始依次对相邻的两个值进行比较,当前面的值大于后面的值时,就交换其位置,进行一轮比较和换位后,n个值中的最大值将位于第n位,然后对前(n-1)个值进行进行第二轮比较,重复该过程直到进行比较的值只剩下一个时为止。

以数组[3,5,7,0,1]为例,说明一下冒泡排序的过程。

  • 第一趟排序:[3,5,0,1,7]
  • 第二趟排序:[3,0,1,5,7]
  • 第三趟排序:[0,1,3,5,7]

具体代码如下所示:

package main

import "fmt"

func Bubble(array []int){
   llen:=len(array)
   for i:=0;i<llen-1;i++{
      for j:=llen-1;j>i;j--{
         if array[j]<array[j-1]{
            tmp:=array[j]
            array[j]=array[j-1]
            array[j-1]=tmp
         }

      }
   }
}

func main(){
   array:=[]int{1,5,3,8,0}
   Bubble(array)
   fmt.Printf("{1,5,3,8,0}冒泡排序的输出为:%v",array)

}

输出为

image.png

5.选择、插入、冒泡的算法性能对比

排序方法最好时间平均时间辅助存储稳定性
选择排序O(n^2)O(n^2)O(1)不稳定
插入排序O(n)O(n^2)O(1)稳定
冒泡排序O(n)O(n^2)O(1)稳定

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情