使用go实现的排序算法

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

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

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