golang常用算法总结

1,041 阅读3分钟

冒泡排序

一个无序的数组序列,通过从前往后对比相邻的两个元素并调整,让较大的数往后排,较小的数往前排,就像吐泡泡一样。

package main

import "fmt"

func bubbleSort(slic []int)[]int{
	lens := len(slic)

	for i:=1;i<lens;i++{
		for j:=0;j<lens-1;j++{
			if slic[i]<slic[j]{
				slic[i],slic[j]=slic[j],slic[i] 
				// 前面元素大于后面元素则交换位置
			}
		}
	}
	return slic
}

func main(){
	slic := []int{3,1,2,6,5,4,8,7,9}
	res := bubbleSort(slic)
	fmt.Println(res)
}

//运行结果
// [1 2 3 4 5 6 7 8 9]

选择排序

应该算是冒泡排序的修改吧,在一个无序的数组中,选出最小的元素与第一个元素位换位置,然后在剩余的数组继续操作,如此循环到倒数第二个元素与最后一个元素比较交换为止。

package main

import "fmt"

func selectSort(slic []int)[]int{
	lens := len(slic)

	for i:=0;i<lens-1;i++{
		// 控制循环轮数
		k:=i
		for j:=i+1;j<lens;j++{
			// 控制比较次数
			if slic[k]>slic[j]{
				// 找出除了slic[k],后面的所有元素中最小的一个元素位置标记
				k=j
			}
		}
		if k!=i{
			// 因为替换了位置标记导致k与i不一样,将标记位置与slic[i]交换
			slic[k],slic[i] = slic[i],slic[k]
		}
	}

	return slic

}

func main(){
	slic := []int{10,8,7,5,6,2,11,16,14,13,1,3}
	fmt.Println(selectSort(slic))
	// [1 2 3 5 6 7 8 10 11 13 14 16]
	
}

快速排序

在一个无序数组序列中,选择一个元素(一般为第一个或者最后一个元素),通过一轮比较,将该数组序列分成两部分,一部分为小于选择的元素,一部分为大于等于选择的元素。此时该选择元素为正确的位置,然后以递归方式,再重复操作划分的两个部分。

package main

import "fmt"

func quickSort(slic []int) []int{
	lens := len(slic)

	if lens<=1{
		return slic
	}

	select_num := slic[0]
	left_slic := []int{}
	right_slic := []int{}
	for i := 1;i<lens;i++{
		if select_num>slic[i]{
			left_slic = append(left_slic,slic[i])
		}else{
			right_slic = append(right_slic, slic[i])
		}
	}
    
    
    // 递归操作
	left_slic = quickSort(left_slic)
	right_slic = quickSort(right_slic)


    // 合并数组
	left_slic = append(left_slic, select_num)

	fmt.Println("left:",left_slic)
	fmt.Println("right:",right_slic)
	
	return append(left_slic, right_slic...)

}

func main(){
	slic := []int{6,4,3,1,2,5,10,9,8,7}
	res := quickSort(slic)
	fmt.Println(res)
}



运行结果:

left: [1]
right: [2]
left: [1 2 3]
right: []
left: [1 2 3 4]
right: [5]
left: [7 8]
right: []
left: [7 8 9]
right: []
left: [7 8 9 10]
right: []
left: [1 2 3 4 5 6]
right: [7 8 9 10]
[1 2 3 4 5 6 7 8 9 10]

插入排序

在无序数组序列中,先选择第n个元素,并假设该元素前面(n-1)个元素的序列已排序,插入该序列使得排好顺序。

package main

import "fmt"

func insertSort(slic []int)[]int{
	lens := len(slic)

	for i := 0; i<lens;i++{
		tmp := slic[i]

		for j := i-1;j>=0;j--{
			if tmp<slic[j]{
				slic[j+1], slic[j] = slic[j],tmp
			}else{
				break
			}
		}
	}
	return slic
}

func main(){
	slic := []int{10,6,4,3,5,9,2,1,8,7}
	fmt.Println(insertSort(slic))
	// [1 2 3 4 5 6 7 8 9 10]
}


睡眠排序

通过给要排序的数组中的每个元素启动独立的任务,每个任务按照待排序元素的key执行相应的睡眠时间,然后按照时间将元素放到一起,达到排序的目的。

package main

import (
	"fmt"
	"time"
)

func sleepSort(slic []int) []int{

	ch := make(chan int)

	for _,value := range slic{
		go func(val int) {
			time.Sleep(time.Duration(val) * 1000000)
			fmt.Println(val)
			ch <- val
		}(value)
	}
	res := []int{}
	for _ = range slic{
		res = append(res,<- ch)
	}
	return res
}

func main(){
	slic := []int{11,9,8,10,6,5,2,1,3,7,4}
	fmt.Println(sleepSort(slic))

	//1
	//2
	//3
	//4
	//5
	//7
	//6
	//9
	//8
	//10
	//11
	//[1 2 3 4 5 7 6 9 8 10 11]
}