go 实现排序算法 - Go语言中文社区

go 实现排序算法


go 十个数组排序方法

package sufa

import (
   "fmt"
   "math"
   "math/rand"
   "strconv"
   "time"
)

func Main2() {
   var li []int
   var r int
   var start, end int64
   //li = []int{90, 23, 433, 343, 53, -1, 56, 7, 7, 8, 6, 45, 4, 5, 66, 7}
   li = []int{}
   for i := 0; i < 10; i++ {
      r = rand.Intn(100)
      li = append(li, r)
   }

   //for i := len(li)-1; i >= 0; i-- {
   ////   fmt.Println(i, li[i])
   // var t = li[0]
   // for j := 1; j < len(li); j++ {
   //    if li[j] < li[j-1] {
   //       t = li[j-1]
   //       li[j-1] = li[j]
   //       li[j] = t
   //    }
   // }
   //}
   fmt.Println(li)
   start = time.Now().UnixNano()

   //BubbleSort(li)
   //SelectSort(li)
   //InsertSort(li)
   //ShellSort(li)
   //MergeSort(li)
   //QuickSort(li)
   //CountSort(li)
   BucketSort(li)
   //Reverse(li)

   //ExChange(li, 0,1)
   end = time.Now().UnixNano()

   fmt.Println(li)
   fmt.Println(end - start)

}

//冒泡排序
func BubbleSort(li []int) {
   for i := len(li) - 1; i >= 0; i-- {
      // fmt.Println(i, li[i])
      var t = li[0]
      for j := 1; j < len(li); j++ {
         if li[j] < li[j-1] {
            t = li[j-1]
            li[j-1] = li[j]
            li[j] = t
         }
      }
      fmt.Print(i, "r")
   }
}
//选择排序
func SelectSort(li []int) {
   for i := 0; i < len(li); i++ {
      var minIndex int = i
      for j := i; j < len(li); j++ {
         if li[j] < li[minIndex] {
            minIndex = j
         }
      }
      ExChange(li, i, minIndex)
   }

}
插入排序
func InsertSort(li []int) {
   for i := 1; i < len(li); i++ {
      var this int = li[i]
      for j := i - 1; j >= 0; j-- {
         if li[j+1] < li[j] {
            ExChange(li, j, j+1)
            continue
         }
         if li[j+1] >= li[j] {
            li[j+1] = this
            break
         }
      }
   }
}
//希尔排序
func ShellSort(li []int) {
   var l = len(li)
   var gap = l / 2
   if l <= 1 {
      return
   }
   for true {
      if gap == 1 {
         InsertSort(li)
         break
      }
      for i := 0; i < gap; i++ {
         var index int
         var group []int = make([]int, 0)
         var groupIdList []int = make([]int, 0)
         //group = append(group, li[i])
         //groupIdList = append(groupIdList, i)
         for j := 0; j < l; j++ {
            index = i + j*gap
            if index >= l {
               break
            }
            group = append(group, li[index])
            groupIdList = append(groupIdList, index)
         }
         InsertSort(group)

         for j := 0; j < len(groupIdList) && j < len(group); j++ {
            var ind int
            if len(groupIdList) <= 1 || len(group) <= 1 {
               break
            }
            ind = groupIdList[j]
            li[ind] = group[j]
         }
      }

      gap = gap / 2
   }

}

func MergeSort(li []int) {
   //merge(li, 0, len(li))

   type funcType func(li []int, left, right int)
   var f funcType
   f = func(li []int, left, right int) {
      var middle = (left + right) / 2
      if right-left <= 1 {
         InsertSort(li[left:right])
         return
      }

      f(li, left, middle)
      f(li, middle, right)

      SelectSort(li[left:middle])
      SelectSort(li[middle:right])
   }
   f(li, 0, len(li))
}
//快速排序
func QuickSort(li []int) {
   //qu(li, 0, len(li))
   if len(li) <= 1 {
      return
   }

   type funcType func(li []int, left, right int)
   var f funcType
   f = func(li []int, left, right int) {
      var pivot int = (right + left) / 2
      if right-left <= 1 {
         InsertSort(li[left:right])
         return
      }

      f(li, left, pivot)
      f(li, pivot, right)
      //fmt.Println(li[left:right], li[pivot])

      for i := pivot - 1; i >= left; i-- {
         if li[i] >= li[pivot] {
            for j := i; j < pivot; j++ {
               ExChange(li, j, j+1)
               //if j+1 == pivot {
               // pivot -= 1
               //}
            }
            pivot -= 1

         }
      }

      for i := right - 1; i > pivot; i-- {
         if li[i] <= li[pivot] {
            for j := i; j > pivot; j-- {
               ExChange(li, j, j-1)
            }
            pivot += 1

         }
      }

      SelectSort(li[left:pivot])
      SelectSort(li[pivot:right])

      //fmt.Println(li[left:right], li[pivot])

   }
   f(li, 0, len(li))

}
//计数排序
func CountSort(li []int) {
   var (
      min = li[0]
      max = li[0]
      ma  []int
      res []int
   )
   for i := 0; i < len(li); i++ {
      if li[i] <= min {
         min = li[i]
      }
      if li[i] >= max {
         max = li[i]
      }
   }
   ma = make([]int, max+1)
   for i := 0; i < len(li); i++ {
      ma[li[i]] += 1
   }

   res = make([]int, 0)
   for i := 0; i < len(ma); i++ {
      if ma[i] != 0 {
         for j := 0; j < ma[i]; j++ {
            res = append(res, i)
         }
      }
   }
   for i := 0; i < len(li); i++ {
      li[i] = res[i]
   }

   //fmt.Println(ma, min, max, res)

}
//桶排序
func BucketSort(li []int) {
   var max = li[0]
   var maxNumb = 0
   for i := 0; i < len(li); i++ {
      if li[i] >= max {
         max = li[i]
      }
   }
   var data = strconv.Itoa(max)
   maxNumb = len(data)

   for i := 0; i < maxNumb; i++ {
      var l = make([][]int, len(li)*2)
      var n = 0
      for j := 0; j < len(li); j++ {
         n = getNumb(li[j], i)
         //fmt.Println(n, li[j], i)
         l[n] = append(l[n], li[j])
      }

      var index = 0
      for j := 0; j < 10; j++ {
         if len(l[j]) > 0 {
            for k := 0; k < len(l[j]); k++ {
               li[index] = l[j][k]
               index++
            }
         }
      }
   }

}
//得到数字的第几位
func getNumb(num, index int) int {
   return (num / int(math.Pow(10, float64(index)))) % 10
}
//交换数组中的两个数
func ExChange(li []int, x, y int) {
   var t int
   t = li[x]
   li[x] = li[y]
   li[y] = t
}
//逆序
func Reverse(li []int) {
   for i := 0; i < len(li)/2; i++ {
      ExChange(li, i, len(li)-i-1)
   }
}
版权声明:本文来源Segmentfault,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://segmentfault.com/a/1190000039944336?sort=votes
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-13 21:52:27
  • 阅读 ( 893 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢