Go 语言实现常见排序算法(上)

简介: 在每次迭代过程中算法随机地从输入序列中移除一个元素,并将改元素插入待排序序列的正确位置

计数排序

package sort
func countingSort(arr []int, bias int) (retArr []int) {
  countingArr := make([]int, bias+1, bias+1)
  retArr = make([]int, len(arr), cap(arr))
  for _, v := range arr {
    countingArr[v]++
  }
  for i := 1; i < len(countingArr); i++ {
    countingArr[i] += countingArr[i-1]
  }
  for i := len(arr) - 1; i >= 0; i-- {
    retArr[countingArr[arr[i]]-1] = arr[i]
    countingArr[arr[i]]--
  }
  return
}

插入排序

插入排序,英文名(insertion sort)是一种简单且有效的比较排序算法。


思想: 在每次迭代过程中算法随机地从输入序列中移除一个元素,并将改元素插入待排序序列的正确位置。重复该过程,直到所有输入元素都被选择一次,排序结束。


类比:抓牌

package sort
func insertionSort(unsorted []int) {
    length = len(unsorted)
    for i := 0; i < length; i++ {
        var insertElement = unsorted[i]
        var insertPosition = i
        for j := insertPosition - 1; j >= 0; j-- {
            if insertElement < unsorted[j] {
                unsorted[j+1] = unsorted[j]
                insertPosition--
            }
        }
        unsorted[insertPosition] = insertElement
    }
}


冒泡排序

冒泡排序是一种最简单的交换排序算法。


什么是交换?交换就是两两进行比较,如果不满足次序就可以交换位置。比如,我们想要从小到大排序,通过两个位置上的值两两比较,如果逆序就交换,使关键字大的记录像泡泡一样冒出来放在末尾。重复执行若干次冒泡排序,最终得到有序序列。


类比: 值较小的元素如同”气泡“一样逐渐漂浮到序列的顶端。

package sort
func bubbleSort(nums []int) {
    length = len(nums)
    lastSwap := length - 1
    lastSwapTemp := length - 1
    for j := 0; j < length; j++ {
        lastSwap = lastSwapTemp
        for i := 0; i < lastSwap; i++ {
            if nums[i] > nums[i+1] {
                nums[i], nums[i+1] = nums[i+1], nums[i]
                lastSwapTemp = i
            }
        }
        if lastSwap == lastSwapTemp {
            break
        }
    }
}

选择排序

选择排序(selection sort)是一种原地(in-place)排序算法,适用于数据量较少的情况。由于选择操作是基于键值的且交换操作只在需要时才执行,所以选择排序长用于数值较大和键值较小的文件。

package sort
func selectionSort(nums []int) {
  length = len(nums)
  var minIdx int // 被选择的最小的值的位置
  for i := 0; i < length-1; i++ {
    minIdx = i
    // 每次循环的第一个元素为最小值保存
    var minValue = nums[minIdx]
    for j := i; j < length-1; j++ {
      if minValue > nums[j+1] {
        minValue = nums[j+1]
        minIdx = j + 1
      }
    }
    // 如果最小值的位置改变,将当前的最小值位置保存
    if i != minIdx {
      var temp = nums[i]
      nums[i] = nums[minIdx]
      nums[minIdx] = temp
    }
  }
}


堆排序

堆排序是一种树形选择排序算法。堆排序的过程:


  1. 构建初始堆
  2. 在输出堆的顶层元素后,从上到下进行调整,将顶层元素与其左右子树的根节点进行比较,并将最小的元素交换到堆的顶部;然后不断调整直到叶子节点得到新的堆。
package sort
import (
  "github.com/shady831213/algorithms/heap"
)
func heapSort(arr []int) {
  h := heap.NewHeapIntArray(arr)
  for i := h.Len() - 1; i > 0; i-- {
    h.Pop()
  }
}
/*not generic heap*/
type intArrayForHeapSort []int
func (h *intArrayForHeapSort) parent(i int) int {
  return i >> 1
}
func (h *intArrayForHeapSort) left(i int) int {
  return (i << 1) + 1
}
func (h *intArrayForHeapSort) right(i int) int {
  return (i << 1) + 2
}
func (h *intArrayForHeapSort) maxHeaplify(i int) {
  largest, largestIdx := (*h)[i], i
  if (*h).left(i) < len((*h)) && (*h)[(*h).left(i)] > largest {
    largest, largestIdx = (*h)[(*h).left(i)], (*h).left(i)
  }
  if h.right(i) < len((*h)) && (*h)[h.right(i)] > largest {
    _, largestIdx = (*h)[h.right(i)], h.right(i)
  }
  if i != largestIdx {
    (*h)[largestIdx], (*h)[i] = (*h)[i], (*h)[largestIdx]
    h.maxHeaplify(largestIdx)
  }
}
func (h *intArrayForHeapSort) buildHeap() {
  for i := (len((*h)) >> 1) - 1; i >= 0; i-- {
    h.maxHeaplify(i)
  }
}
func heapSort2(arr []int) {
  h := intArrayForHeapSort(arr)
  h.buildHeap()
  for i := len(h) - 1; i > 0; i-- {
    h[0], h[i] = h[i], h[0]
    h = h[:i]
    h.maxHeaplify(0)
  }
}
相关文章
|
26天前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
67 2
|
25天前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
146 0
|
25天前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
129 0
|
23天前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
100 15
|
1月前
|
存储 缓存 算法
如何管理员工上网:基于 Go 语言实现的布隆过滤器访问拦截算法应用
布隆过滤器以空间换时间,通过多哈希函数实现黑名单的高效存储与毫秒级检索,解决传统方案内存占用大、响应慢等问题,助力企业低成本、高效率管理员工上网行为。
107 3
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
118 1
|
2月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
102 3
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
341 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
221 0
|
3月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
196 0

热门文章

最新文章