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]
    }
  }
}
目录
打赏
0
0
0
0
6
分享
相关文章
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
109 15
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
72 1
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
上网管理监控软件的 Go 语言流量特征识别算法实现与优化
本文探讨基于Go语言的流量特征识别算法,用于上网管理监控软件。核心内容涵盖AC自动机算法原理、实现及优化,通过路径压缩、哈希表存储和节点合并策略提升性能。实验表明,优化后算法内存占用降低30%,匹配速度提升20%。在1000Mbps流量下,CPU利用率低于10%,内存占用约50MB,检测准确率达99.8%。未来可进一步优化高速网络处理能力和融合机器学习技术。
87 10
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
57 10
Go实现常见的限流算法
本文介绍了五种常见的限流算法:固定窗口、滑动窗口、漏桶算法、令牌桶和滑动日志。固定窗口简单高效,但可能产生两倍突发流量;滑动窗口可避免突发问题,但可能掐断流量;漏桶算法搭配生产者消费者模式实现平滑流量;令牌桶允许一定突发流量;滑动日志适用于多级限流场景。每种算法通过Go语言实现并附有代码解读,帮助理解其工作原理与适用场景。
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
101 14
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
73 8
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
89 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问