排序算法

1. 冒泡排序

/**
* 冒泡排序
 */
func BubbleSort(slice []int) {
	n := len(slice)            //切片长度
	for i := 0; i < n-1; i++ { //冒泡最多n-1轮
		exchange := false
		for j := 0; j < n-1-i; j++ { //每一轮冒泡
			if slice[j] > slice[j+1] { //调换位置
				slice[j], slice[j+1] = slice[j+1], slice[j]
				exchange = true
			}
		}
		if !exchange { //没有发生位置调换,已是有序,可提前退出
			break
		}
	}
}

2. 选择排序

/**
* 选择排序
 */
func SelectSort(slice []int) {
	n := len(slice)
	for i := 0; i < n-1; i++ {
		pos := i
		for j := i + 1; j < n; j++ {
			if slice[j] < slice[pos] {
				pos = j //记录最小数位置
			}
		}
		if pos != i { //调换位置
			slice[i], slice[pos] = slice[pos], slice[i]
		}
	}
}

3. 插入排序

/**
* 插入排序
 */
func InsertSort(slice []int) {
	n := len(slice)
	for i := 1; i < n; i++ {
		for j := i; j > 0; j-- { //从后往前比较,边比较边移位,直至找到插入位置
			if slice[j] < slice[j-1] { //调换位置
				slice[j-1], slice[j] = slice[j], slice[j-1]
			} else { //已找到插入位置,进入下一个待排序元素的插入
				break
			}
		}
	}
}

4. 希尔排序

算法原理理解:https://blog.csdn.net/qq_39207948/article/details/80006224

/**
* 希尔排序:对插入排序的优化,适用于大量数据排序
*/
func ShellSort(slice []int) {
	n := len(slice)
	for add := n / 2; add > 0; add /= 2 { //增量控制
		for i := add; i < n; i++ {
			for j := i; j >= add; j -= add {
				if slice[j] < slice[j-add] {
					slice[j-add], slice[j] = slice[j], slice[j-add]
				} else {
					break
				}
			}
		}
	}
}

5. 堆排序

算法原理理解:https://www.cnblogs.com/Java3y/p/8639937.html

/**
* 堆排序:利用堆进行选择排序
 */
func HeapSort(slice []int) {
	n := len(slice)
	//建堆
	for root := n / 2; root >= 0; root-- {
		Heapify(slice, root)
	}
	//排序
	for i := n; i > 1; i-- {
		slice[0], slice[i-1] = slice[i-1], slice[0]
		Heapify(slice[:i-1], 0)
	}
}

//堆调整
func Heapify(slice []int, root int) {
	n := len(slice)
	left := root*2 + 1
	right := root*2 + 2
	max := root
	if left < n && slice[max] < slice[left] {
		max = left
	}
	if right < n && slice[max] < slice[right] {
		max = right
	}
	if max != root {
		slice[root], slice[max] = slice[max], slice[root]
		Heapify(slice, max)
	}
}

6. 归并排序

算法原理理解:https://www.jianshu.com/p/33cffa1ce613

/**
* 归并排序
 */
func MergeSort(slice []int) {
	n := len(slice)
	if n == 1 {
		return
	}
	mid := n / 2
	MergeSort(slice[:mid])
	MergeSort(slice[mid:n])
	p1, p2 := 0, mid
	var newSlice []int
	for p1 < mid && p2 < n {
		if slice[p1] < slice[p2] {
			newSlice = append(newSlice, slice[p1])
			p1++
		} else {
			newSlice = append(newSlice, slice[p2])
			p2++
		}
	}
	if p1 < mid {
		for p1 < mid {
			newSlice = append(newSlice, slice[p1])
			p1++
		}
	}
	if p2 < n {
		for p2 < n {
			newSlice = append(newSlice, slice[p2])
			p2++
		}
	}
	for k, v := range newSlice {
		slice[k] = v
	}
}

7. 快速排序

func QuickSort(slice []int, start, end int) {
	if start >= end {
		return
	}
	i, j := start, end
	val := slice[(start+end)/2]
	for i <= j {
		for i <= end && slice[i] < val {
			i++
		}
		for j >= start && slice[j] > val {
			j--
		}
		if i <= j {
			slice[i], slice[j] = slice[j], slice[i]
			i++
			j--
		}
	}
	if start < j {
		QuickSort(slice, start, j)
	}
	if i < end {
		QuickSort(slice, i, end)
	}
}
原文地址:https://www.cnblogs.com/wujuntian/p/11612892.html