分享
  1. 首页
  2. 文章

使用go实现的排序算法

light · · 1335 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go实现的部分排序算法,待整理

// algorithm project main.go
package main
import (
 "fmt"
)
func main() {
 arr := []int{50, 45, 42, 30, 25, 20, 20, 5, 60, 3, 23, 50, 29, 235, 9}
 //arr := []int{50, 235, 60}
 fmt.Println(arr)
 fmt.Println("----------")
 //直接插入排序
 //arr1 := insertSort(arr)
 //arr1 := selectSort(arr)
 //a, b := selectMinAndMax(arr, 0, 14)
 //arr1 := selectSortPlus(arr)
 quickSort(arr, 0, len(arr)-1)
 fmt.Println(arr)
}
/******** 冒泡排序begin ********/
func bubbleSort(arr []int) []int {
 length := len(arr)
 for j := length - 1; j > 0; j-- {
 for i := 0; i < j; i++ {
 if arr[i] > arr[i+1] {
 exchange(arr, i, i+1)
 fmt.Println(arr)
 }
 }
 fmt.Println("++++++++++")
 }
 return arr
}
/******** 冒泡排序end ********/
/******* 直接插入排序begin ********/
//注意第一次排序应该是把第一位,即索引为0的看做一个有序序列了
func insertSort(arr []int) []int {
 //获取当前数组长度
 length := len(arr)
 for i := 1; i < length; i++ {
 //当前值
 now := arr[i]
 //如果当前哨兵小于之前序列中的某一个k的值,则序列从k向后整体移动一位
 for j := i - 1; j >= 0; j-- {
 if now < arr[j] {
 arr[j+1] = arr[j]
 arr[j] = now
 } else {
 arr[j+1] = now
 break
 }
 }
 fmt.Println(arr)
 }
 return arr
}
/******* 直接插入排序end ********/
/******* 选择排序-简单选择排序begin ********/
//选出最小的key值
/*
@param arr 待排序数组
@param i从第i个元素获取最小值
*/
func selectMin(arr []int, i int) int {
 length := len(arr)
 minKey := i
 minValue := arr[minKey]
 //从下标为i及之后的元素中找出值最小的元素
 for k := minKey + 1; k < length; k++ {
 if minValue > arr[k] {
 //如果当前值大于之后某一元素,说明不是最小值,和之后元素交换
 minKey = k
 minValue = arr[k]
 }
 }
 return minKey
}
func exchange(arr []int, a int, b int) {
 temp := arr[a]
 arr[a] = arr[b]
 arr[b] = temp
}
//开始进行选择排序
func selectSort(arr []int) []int {
 length := len(arr)
 for i := 0; i < length; i++ {
 //每循环一次都找出当前未排序元素中的最小值,和当前元素进行交换
 minKey := selectMin(arr, i)
 exchange(arr, i, minKey)
 fmt.Println(i, arr)
 }
 return arr
}
/******* 选择排序-简单选择排序end ********/
/******** 选择排序的改进,二元选择排序begin ********/
func selectMinAndMax(arr []int, i int, j int) (int, int) {
 //length := len(arr)
 minKey := i
 minValue := arr[minKey]
 maxKey := j
 maxValue := arr[maxKey]
 //从下标为i及之后的元素中找出值最小的元素
 for k := minKey + 1; k < j; k++ {
 if minValue > arr[k] {
 //如果当前值大于之后某一元素,说明不是最小值,和之后元素交换
 minKey = k
 minValue = arr[k]
 }
 if maxValue < arr[k] {
 maxKey = k
 maxValue = arr[k]
 }
 }
 return minKey, maxKey
}
func selectSortPlus(arr []int) []int {
 length := len(arr)
 //
 for i := 0; i <= length/2; i++ {
 //一次循环,找出最大和最小值,分别替换最大端和最小端顶头部分
 minKey, maxKey := selectMinAndMax(arr, i, length-1-i)
 exchange(arr, i, minKey)
 exchange(arr, length-1-i, maxKey)
 fmt.Println(minKey, maxKey)
 }
 return arr
}
/******** 选择排序的改进,二元选择排序end ********/
/******** 快速排序begin ********/
func quickSort(arr []int, left int, right int) {
 fmt.Println(left, right)
 //设置基准数,选择第一个作为基准数
 baseKey := left
 baseValue := arr[baseKey]
 i := left
 j := right
 for i < j {
 fmt.Println(i, j)
 //先从右向左找,直到找到一个小于基准数的值
 for (arr[j] >= baseValue) && (i < j) {
 j--
 }
 if i < j {
 //将j的值放到i的空位上
 arr[i] = arr[j]
 }
 //从左向右找,直到找到一个大于基准数的值
 for (i < j) && (arr[i] < baseValue) {
 i++
 }
 if i < j {
 //将此时的i放到之前j产生的空位上
 arr[j] = arr[i]
 }
 fmt.Println(i, j)
 }
 arr[i] = baseValue
 fmt.Println(arr)
 if left < i-1 {
 quickSort(arr, left, i-1)
 }
 if i+1 < right {
 quickSort(arr, i+1, right)
 }
}
/******** 快速排序end ********/

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:light

查看原文:使用go实现的排序算法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1335 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏