go语言实现六种排序

一、快速排序

func quickSort(a []int, start, end int) {
	if end <= start {
		return
	}
	nStart := start
	nEnd := end
	//需要从后往前
	for nStart < nEnd {
		for nStart < nEnd && a[nEnd] >= a[start] {
			nEnd--
		}
		for nStart < nEnd && a[nStart] <= a[start] {
			nStart++
		}
		if nStart < nEnd {
			a[nStart], a[nEnd] = a[nEnd], a[nStart]
		}
	}
	a[start], a[nStart] = a[nStart], a[start]
	quickSort(a, start, nStart-1)
	quickSort(a, nStart+1, end)
}

二、归并排序

func mergeSort(a []int, start, end int) {
	if end-start <= 1 {
		return
	}
	mid := (start + end) / 2
	mergeSort(a, start, mid)
	mergeSort(a, mid, end)
	left := make([]int, mid-start)
	right := make([]int, end-mid)
	copy(left, a[start:mid])
	copy(right, a[mid:end])
	i := 0
	j := 0
	for k := start; k < end; k++ {
		switch {
		case i >= len(left):
			a[k] = right[j]
			j++
		case j >= len(right):
			a[k] = left[i]
			i++
		case left[i] > right[j]:
			a[k] = right[j]
			j++
		case left[i] <= right[j]:
			a[k] = left[i]
			i++
		}
	}
}

三、冒泡排序

func bubbleSort(s []int) {
	length := len(s)
	for i := length - 1; i >= 0; i-- {
		for j := 0; j < i; j++ {
			if s[j] >= s[j+1] {
				s[j], s[j+1] = s[j+1], s[j]
			}
		}
	}
}

四、插入排序

func insertSort(s []int) {
	length := len(s)
	for i := 0; i < length; i++ {
		for j := i; j > 0; j-- {
			if s[j] < s[j-1] {
				s[j], s[j-1] = s[j-1], s[j]
			} else {
				break
			}
		}
	}
}

五、选择排序

func chooseSort(s []int) {
	length := len(s)
	for i := 0; i < length; i++ {
		min := i
		for j := length - 1; j >= i; j-- {
			if s[j] < s[min] {
				min = j
			}
		}
		s[min], s[i] = s[i], s[min]
	}
}

六、堆排序

1、引用go的库来实现

import (
	"container/heap"
	"fmt"
)

//堆排序调库初始化
type NewHeap []int

func (h NewHeap) Len() int {
	return len(h)
}

func (h NewHeap) Less(x, y int) bool {
	return h[x] < h[y]
}

func (h NewHeap) Swap(x, y int) {
	h[x], h[y] = h[y], h[x]
}

func (h *NewHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
}

func (h *NewHeap) Pop() interface{} {
	n := len(*h)
	x := (*h)[n-1]
	*h = append((*h)[:n-1])
	return x
}

2、自己实现

func sort(num []int) {
	length := len(num) - 1
	for root := length / 2; root >= 0; root-- {
		buildHeap(num, length, root)
	}
	for end := length; end >= 0; end-- {
		if num[0] > num[end] {
			num[0], num[end] = num[end], num[0]
			buildHeap(num, end-1, 0)
		}
	}
}

func buildHeap(num []int, end, root int) {
	child := root*2 + 1
	for {
		if child > end {
			break
		}
		if child+1 <= end && num[child] < num[child+1] {
			child += 1
		}
		if num[root] < num[child] {
			num[root], num[child] = num[child], num[root]
			root = child
			child = root*2 + 1
		} else {
			break
		}
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值