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

简介: 高效的排序算法,它采用 分而治之 的思想,把大的拆分为小的,小的再拆分为更小的。

希尔排序

package sort
func swap(array []int, a int, b int) {
    array[a] = array[a] + array[b]
    array[b] = array[a] - array[b]
    array[a] = array[a] - array[b]
}
func shellSort(array []int) {
    length = len(array)
    for gap := length / 2; gap > 0; gap = gap / 2 {
        for i := gap; i < length; i++ {
            var j = i
            for {
                if j-gap < 0 || array[j] >= array[j-gap] {
                    break
                }
                swap(array, j, j-gap)
                j = j - gap
            }
        }
    }
}


归并排序

利用递归与分治技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列。其中“归”代表的是递归的意思,即递归地将数组折半地分离为单个数组。


给定一组序列含 n 个元素,首先将每两个相邻的长度为 1 的子序列进行归并,得到 n/2(向上取整)个长度为 2 或 1 的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列为止。

package sort
/*
merge sort O(nlgn):
T(n) = 2T(n/2) + O(n)
master theorem:
a = 2, b = 2, f(n) = n
logb(a) = lg2 = 1 f(n) = f(n^logb(a)) = f(n^1)
so, O(n) = O(n^logb(a)lgn) = O(nlgn)
*/
import (
  "sync"
)
func merge(arr []int) {
  i := len(arr) / 2
  //copy left and right array
  leftArr, rightArr := make([]int, i, i), make([]int, len(arr)-i, len(arr)-i)
  copy(leftArr, arr[:i])
  copy(rightArr, arr[i:])
  leftIter, rightIter := ints(leftArr).Iter(), ints(rightArr).Iter()
  leftValue, leftHasNext := leftIter()
  rightValue, rightHasNext := rightIter()
  //merge
  for k := range arr {
    if !leftHasNext { //left empty, use right value, in CLRS, use infinity
      arr[k] = rightValue
      rightValue, rightHasNext = rightIter()
    } else if !rightHasNext { //right empty, use left value, in CLRS, use infinity
      arr[k] = leftValue
      leftValue, leftHasNext = leftIter()
    } else {
      if leftValue > rightValue {
        arr[k] = rightValue
        rightValue, rightHasNext = rightIter()
      } else {
        arr[k] = leftValue
        leftValue, leftHasNext = leftIter()
      }
    }
  }
}
func mergeSort(arr []int) {
  i := len(arr) / 2
  if i > 0 {
    mergeSort(arr[:i])
    mergeSort(arr[i:])
    merge(arr)
  }
}
func mergeSortParallel(arr []int) {
  i := len(arr) / 2
  if i > 0 {
    var wd sync.WaitGroup
    wd.Add(2)
    go func() {
      mergeSortParallel(arr[:i])
      wd.Done()
    }()
    go func() {
      mergeSortParallel(arr[i:])
      wd.Done()
    }()
    wd.Wait()
    merge(arr)
  }
}

快速排序

高效的排序算法,它采用 分而治之 的思想,把大的拆分为小的,小的再拆分为更小的。


其原理是:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前部分的所有记录均比后部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。

package sort
import "math/rand"
func partition(arr []int) (primeIdx int) {
  primeIdx = 0
  for i := 0; i < len(arr)-1; i++ {
    if arr[i] < arr[len(arr)-1] {
      arr[i], arr[primeIdx] = arr[primeIdx], arr[i]
      primeIdx++
    }
  }
  arr[primeIdx], arr[len(arr)-1] = arr[len(arr)-1], arr[primeIdx]
  return
}
func quickSort(arr []int) {
  if len(arr) > 1 {
    primeIdx := partition(arr)
    quickSort(arr[:primeIdx])
    quickSort(arr[primeIdx+1:])
  }
}
func randomQuickSort(arr []int) {
  if len(arr) > 1 {
    primeIdx := rand.Intn(len(arr))
    arr[primeIdx], arr[len(arr)-1] = arr[len(arr)-1], arr[primeIdx]
    primeIdx = partition(arr)
    randomQuickSort(arr[:primeIdx])
    randomQuickSort(arr[primeIdx+1:])
  }
}
func quickSortTail(arr []int) {
  for len(arr) > 1 {
    primeIdx := partition(arr)
    if primeIdx < len(arr)/2 {
      quickSortTail(arr[:primeIdx])
      arr = arr[primeIdx+1:]
    } else {
      quickSortTail(arr[primeIdx+1:])
      arr = arr[:primeIdx]
    }
  }
}
相关文章
|
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

热门文章

最新文章