前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go排序算法快速实现

go排序算法快速实现

原创
作者头像
Johns
修改2022-08-11 11:02:40
2880
修改2022-08-11 11:02:40
举报
文章被收录于专栏:代码工具代码工具

常见的排序算法实现

主要实现快速排序, 冒泡排序, 堆排序 3种常用的排序算法

代码语言:txt
复制
package main

import (
	"fmt"
)

// 快速排序
// 基本思路: 选取移动作为中心点, 然后把比他大的和比它小的分别放在left和right两边, 同时注意处理// 好和中心点相等的情况
func QuickSort(arr []int) []int {
	if len(arr) <= 1 {
		return arr
	}
	mData := arr[0]
	low := make([]int, 0, 0)
	high := make([]int, 0, 0)
	mid := make([]int, 0, 0)
	mid = append(mid, mData)
	for i := 1; i < len(arr); i++ {
		if arr[i] > mData {
			high = append(high, arr[i])
		}
		if arr[i] < mData {
			low = append(low, arr[i])
		}
		if arr[i] == mData {
			mid = append(mid, arr[i])
		}
	}
	low, high = QuickSort(low), QuickSort(high)
	newArr := append(append(low, mid...), high...)
	return newArr
}

// 使用快慢指针的实现方式, 效率更高
func QuickSort2(nums []int, l int, r int) {
	if l < r {
		mid := partition(nums, l, r)
		QuickSort(nums, l, mid-1)
		QuickSort(nums, mid+1, r)
	}
}

func partition(nums []int, l int, r int) int {
	key := nums[r]
	fast, slow := l, l
	for fast < r {
		if nums[fast] > key {
			nums[fast], nums[slow] = nums[slow], nums[fast]
			slow++
		}
		fast++
	}
	nums[slow], nums[r] = nums[r], nums[slow]
	return slow
}

// 冒泡排序
// 基本思路: 每次循环都把当次循环最大的值放到尾部, 每一轮的最大值像气泡一样不断地向某个方向移动
func BubbleSort(arr []int) []int {
	if len(arr) <= 1 {
		return arr
	}
	for i := 0; i < len(arr); i++ {
		for j := i + 1; j < len(arr); j++ {
			if arr[i] > arr[j] {
				arr[i], arr[j] = arr[j], arr[i]
			}
		}
	}
	return arr
}

// 堆排序
// 基本思路: 找到最大的节点, 通过位置变换把它移动到堆顶
func HeapSortMax(arr []int, length int) []int {
	if len(arr) <= 1 {
		return arr
	}
	depth := length/2 - 1
	for i := depth; i >= 0; i-- {
		topMax := i
		leftChild := 2*i + 1
		rightChild := 2*i + 2
		if leftChild <= length-1 && arr[leftChild] > arr[topMax] {
			topMax = leftChild
		}
		if rightChild <= length-1 && arr[rightChild] > arr[topMax] {
			topMax = rightChild
		}
		if topMax != i {
			arr[i], arr[topMax] = arr[topMax], arr[i]
		}
	}
	return arr
}

// 每次把堆顶的节点后和本次循环倒数第i个节点交换
func HeapSort(arr []int) []int {
	length := len(arr)
	if length <= 1 {
		return arr
	}
	for i := 0; i < length; i++ {
		lastLen := length - i
		HeapSortMax(arr, lastLen)
		if i < length {
			arr[0], arr[lastLen-1] = arr[lastLen-1], arr[0]
		}
	}
	return arr
}

func main() {
	arr := []int{4, 6, 8, 1, 0, 2, 2, 4, 7, 9, 10, 34, 99, 0, 1, 4}
	fmt.Println(QuickSort(arr))

    arr2 := []int{4, 6, 8, 1, 0, 2, 2, 4, 7, 9, 10, 34, 99, 0, 1, 4}
	QuickSort2(arr2)
	fmt.Println(arr2)

	fmt.Println(BubbleSort(arr))

	fmt.Println(HeapSort(arr))
	fmt.Println(HeapSort([]int{1, 9}))
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见的排序算法实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档