五、golang实现排序
实现排序:
1、实现一个冒泡排序
2、实现一个选择排序
3、实现一个插入排序
4、实现一个快速排序
冒泡排序
package main import( "fmt" ) func bsort(a [] int){ for i :=0;i<len(a);i++{ for j:=1;j<len(a)-i;j++{ if a[j]<a[j-1]{ a[j],a[j-1]=a[j-1],a[j] } } } } func main() { b := [...]int{8, 7, 5, 4, 3, 10, 15} bsort(b[:]) fmt.Println(b) }
选择排序
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
package main import ( "fmt" ) func ssort(a [] int){ for i:=0;i<len(a);i++{ for j:=i+1;j<len(a);j++{ if a[i]<a[j]{ a[i],a[j]=a[j],a[i] } } } } func main(){ b:=[...]int{8,7,5,4,3,10,15} ssort(b[:]) fmt.Println(b) //[15 10 8 7 5 4 3] }
package main import ( "fmt" ) func ssort(a [] int){ for i:=0;i<len(a);i++{ var min int=i for j:=i+1;j<len(a);j++{ if a[min]>a[j]{ min=j } } a[i],a[min]=a[min],a[i] } } func main(){ b:=[...]int{8,7,5,4,3,10,15} ssort(b[:]) fmt.Println(b) //[15 10 8 7 5 4 3] }
插入排序
原理:选择第一个数,然后把后面的数和第一个数进行比较,然后如果小于第一个数的话那么就插入到第一个数前面,如果大于第一个数就插入到第一个数后面,
主要两个for循环,然后第一个for循环要从1开始,第二个for循环因为要和第一个序列进行比较所以要等于i,所以后面的数要大于0,并且要减减的方式
package main import ( "fmt" ) func isort(a[]int){ for i:=1;i<len(a);i++{ for j:=i;j>0;j--{ if a[j]>a[j-1]{ break } a[j],a[j-1]=a[j-1],a[j] } } } func main(){ b:=[...]int{8,7,5,4,3,10,15} isort(b[:]) fmt.Println(b) }
快速排序
原理:对于无序的序列,把他们划分为左边和右边两个序列,然后进行排序
首先要确定选择的值排序之后的位置,然后递归计算,退出条件是左边的下标大于或者等于右边减去1的下标
package main import( "fmt" ) func qsort(a []int,left,right int){ if left>=right{ //如果左边大于等于右边减去1的值,就退出 return } val :=a[left] k:=left //确定val所在的位置,这个就是确定val排序之后所在的位置 for i:=left+1;i<=right;i++{ if a[i]<val{ a[k]=a[i] a[i]=a[k+1] k++ } } //这个是确定val所对应的在数组中的位置 a[k]=val //下面是分别递归排序左边和右边 qsort(a,left,k-1) qsort(a,k+1,right) } func main(){ b:=[...]int{8,7,5,4,3,10,15} qsort(b[:],0,len(b)-1) fmt.Print(b) }