经典排序算法--Go实现版

68 阅读1分钟

选择排序

package main

import (
	"fmt"
)

func selectSort(array []int) []int {
	for i := 0; i < len(array); i++ {
		min := i
		for j := i + 1; j < len(array); j++ {
			if array[j] < array[min] {
				min = j
			}
		}

		tmp := array[i]
		array[i] = array[min]
		array[min] = tmp
	}
	return array
}

func main() {
	arr := []int{2, 3, 42, 3, 234, 2, 32, 3234, 53, 6346, 89}
	selectSort(arr)
	for i := range arr {
		fmt.Println(arr[i])
	}
}

冒泡排序

package main

import "fmt"

func bubbleSort(arr []int) []int {
	flag := true
	for flag {
		flag = false
		for i := 0; i < len(arr)-1; i++ {
			if arr[i+1] < arr[i] {
				arr[i+1], arr[i] = arr[i], arr[i+1]
				flag = true
			}
		}
	}
	return arr
}

func main() {
	arr := []int{3, 3, 4, 54, 6, 75, 54}
	bubbleSort(arr)
	for i := range arr {
		fmt.Println(arr[i])
	}
}

插入排序

package main

import "fmt"

func InsertSort(array []int) []int {
	if len(array) < 2 {
		return array
	}
	for i := 1; i < len(array); i++ {
		value := array[i]
		j := i - 1
		for ; j >= 0; j-- {
			if array[j] > value {
				array[j+1] = array[j]
			} else {
				break
			}
		}
		array[j+1] = value
	}
	return array
}

func main() {
	array := []int{5, 8, 6, 3, 9, 2, 1, 7}
	InsertSort(array)
	for i := range array {
		fmt.Println(array[i])
	}
}

希尔排序

package main

import "fmt"

func shellSort(arr []int) []int {
	for d := int(len(arr) / 2); d > 0; d /= 2 {
		for i := d; i < len(arr); i++ {
			for j := i; j >= d && arr[j-d] > arr[j]; j -= d {
				arr[j], arr[j-d] = arr[j-d], arr[j]
			}
		}
	}
	return arr
}

func main() {
	array := []int{4, 5, 44, 35, 57, 53, 78, 65}
	shellSort(array)
	for i := range array {
		fmt.Println(array[i])
	}
}

归并排序

package main

import "fmt"

func merge(arr []int, left int, mid int, right int) {
	var arr1 = make([]int, len(arr))
	var l = left
	var r = mid + 1
	var temp = left
	for l <= mid && r <= right {
		if arr[l] < arr[r] {
			arr1[temp] = arr[l]
			l++
		} else {
			arr1[temp] = arr[r]
			r++
		}
		temp++
	}

	for l <= mid {
		arr1[temp] = arr[l]
		temp++
		l++
	}
	for r <= right {
		arr1[temp] = arr[r]
		temp++
		r++
	}

	for i := left; i <= right; i++ {
		arr[i] = arr1[i]
	}
}

func mergeSort(arr []int, left int, right int) {
	if right > left {
		mid := (left + right) / 2
		mergeSort(arr, left, mid)
		mergeSort(arr, mid+1, right)
		merge(arr, left, mid, right)
	}
}

func main() {
	array := []int{3, 5, 75, 34, 8, 31, 44, 76, 87, 25, 73, 11}
	mergeSort(array, 0, len(array)-1)
	fmt.Println(array)
}

快速排序

package main

import "fmt"

func quickSort(arr []int) {
	l := len(arr)
	if l < 2 {
		return
	}
	left, right := 0, l-1
	value := arr[left]
	for left < right {
		if arr[left+1] > value {
			arr[left+1], arr[right] = arr[right], arr[left+1]
			right--
		} else if arr[left+1] < arr[left] {
			arr[left], arr[left+1] = arr[left+1], arr[left]
			left++
		} else {
			left++
		}
	}
	quickSort(arr[:left])
	quickSort(arr[left+1:])
}

func main() {
	arr := []int{2, 3, 4, 5, 32, 2, 43, 2, 1, 56, 43, 6, 3, 4}
	quickSort(arr)
	fmt.Println(arr)
}

堆排序

package main

import "fmt"

func heapSortMax(arr []int, len int) []int {
	if len < 2 {
		return arr
	}
	depth := len/2 - 1
	for i := depth; i >= 0; i-- {
		topmax := i
		leftchild := 2*i + 1
		rightchild := 2*i + 2
		if leftchild <= len-1 && arr[leftchild] > arr[topmax] {
			topmax = leftchild
		}
		if rightchild <= len-1 && arr[rightchild] > arr[topmax] {
			topmax = rightchild
		}
		if topmax != i {
			arr[i], arr[topmax] = arr[topmax], arr[i]
		}
	}
	return arr
}

func heapSort(arr []int) []int {
	len := len(arr)
	for i := 0; i < len; i++ {
		lastlen := len - i
		heapSortMax(arr, lastlen)
		if i < len {
			arr[0], arr[lastlen-1] = arr[lastlen-1], arr[0]
		}
	}
	return arr
}

func main() {
	arr := []int{1, 9, 2, 0, 6, 54, 34, 36, 33, 5, 34, 567, 8, 9, 68}
	heapSort(arr)
	fmt.Println(arr)
}