go排序

插入排序

package main

import "fmt"

func main() {

	arr := []int{4, 6, 1, 9, 2}
	newarr := insertSort(arr)
	fmt.Println(arr)
	fmt.Println(newarr)
}

// 插入排序,从第二个元素开始和前一个比较,小于就将前一个数往后移,然后就插入第一个元素,后然依次类推
func insertSort(arr []int) []int {
	for i := 1; i < len(arr); i++ {
		j := i
		current := arr[j]
		for j > 0 {
			if arr[j-1] > current {
				arr[j] = arr[j-1]
				j--
			} else {
				break
			}
		}

		arr[j] = current
	}

	return arr
}

 

冒泡排序

package main

import "fmt"

func main() {

	arr := []int{4, 6, 1, 9, 2}
	newarr := bubbleSort(arr)
	fmt.Println(arr)
	fmt.Println(newarr)
}

// 从第一个元素开始和后面逐个比较,大的往后移,小的移前移,第一轮移动最后一个,第二轮移动倒数第二个,直接第一个元素不能再比较移动
func bubbleSort(arr []int) []int {

	i := len(arr)
	for i > 0 {
		for j := 0; j < i-1; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}

		i--
	}

	return arr
}

选择排序

package main

import "fmt"

func main() {

	arr := []int{4, 6, 1, 9, 2, 5, 3, 8, 7}
	newarr := selectionSort(arr)
	fmt.Println(arr)
	fmt.Println(newarr)
}

// 选择排序,由左边起第一个起,找出最小的和第一个交换位置,再从第二个起,找出最小的和第二个交换位置,重复可得结果.
func selectionSort(arr []int) []int {

	for i := 0; i < len(arr)-1; i++ {
		minIdx := i
		for j := i; j < len(arr)-1; j++ {
			if arr[minIdx] > arr[j+1] {
				minIdx = j + 1
			}
		}

		arr[i], arr[minIdx] = arr[minIdx], arr[i]
	}

	return arr
}

 

希尔排序

package main

import "fmt"

func main() {

	arr := []int{4, 6, 1, 9, 2, 5, 3, 8, 7}
	newarr := shellSort(arr)
	fmt.Println(arr)
	fmt.Println(newarr)
}

// 希尔排序,先除以2得最大间隔两数组成组进和地插入排序,再将间隔/2组成组插入排序,直到没有间隔
func shellSort(arr []int) []int {

	l := len(arr)

	// 间隔多少组成一组,除以2表示最大间隔
	d := l / 2

	for d > 0 {
		for i := 0; i < d; i++ {
			// 插入排序
			for z := i + d; z < l; z = z + d {
				j := z
				current := arr[j]
				for j > i && arr[j-d] > current {
					arr[j] = arr[j-d]
					j = j - d
				}

				arr[j] = current
			}
		}

		// 将间隔减倍
		d = d / 2
	}

	return arr
}
posted @ 2021-10-21 09:18  wahgon  阅读(30)  评论(0编辑  收藏  举报