技术文摘
以 Go 语言学习归并排序算法
2024-12-31 02:32:53 小编
以 Go 语言学习归并排序算法
在编程的世界里,排序算法是基础且重要的一部分。归并排序作为一种高效的排序算法,以其稳定的性能和良好的时间复杂度在众多算法中脱颖而出。在 Go 语言中学习和实现归并排序,不仅能加深对算法的理解,还能提升我们的编程能力。
归并排序(Merge Sort)是建立在归并操作上的一种有效、稳定的排序算法,其时间复杂度为 O(n log n)。基本思想是将一个序列分成两个子序列,分别对这两个子序列进行排序,然后将排好序的子序列合并成一个最终的有序序列。
下面是用 Go 语言实现归并排序的核心代码:
package main
import "fmt"
// 合并两个已排序的子数组为一个排序数组
func merge(arr []int, l int, m int, r int) {
n1 := m - l + 1
n2 := r - m
// 创建临时数组
left := make([]int, n1)
right := make([]int, n2)
// 复制数据到临时数组
for i := 0; i < n1; i++ {
left[i] = arr[l+i]
}
for j := 0; j < n2; j++ {
right[j] = arr[m+1+j]
}
// 初始化索引
i, j, k := 0, 0, l
// 合并临时数组回到 arr
for i < n1 && j < n2 {
if left[i] <= right[j] {
arr[k] = left[i]
i++
} else {
arr[k] = right[j]
j++
}
k++
}
// 复制剩余元素
for i < n1 {
arr[k] = left[i]
i++
k++
}
for j < n2 {
arr[k] = right[j]
j++
k++
}
}
// 归并排序函数
func mergeSort(arr []int, l int, r int) {
if l < r {
m := l + (r-l)/2
mergeSort(arr, l, m)
mergeSort(arr, m+1, r)
merge(arr, l, m, r)
}
}
// 打印数组函数
func printArray(arr []int, size int) {
for i := 0; i < size; i++ {
fmt.Printf("%d ", arr[i])
}
fmt.Println()
}
func main() {
arr := []int{12, 11, 13, 5, 6}
n := len(arr)
fmt.Println("排序前的数组为:")
printArray(arr, n)
mergeSort(arr, 0, n-1)
fmt.Println("排序后的数组为:")
printArray(arr, n)
}
在上述代码中,我们首先定义了 merge 函数用于合并两个已排序的子数组。然后,mergeSort 函数通过递归的方式将数组不断分成两半,直到子数组的长度为 1,再进行合并操作。
通过使用 Go 语言实现归并排序算法,我们可以更加深入地理解递归、函数调用以及数组操作等编程概念。在实际应用中,归并排序也能有效地处理大规模数据的排序需求。
掌握归并排序算法并用 Go 语言实现它,对于提升我们的算法和编程能力有着重要的意义。希望大家通过不断的实践和探索,能够更加熟练地运用归并排序以及其他优秀的算法来解决各种实际问题。
- 吴继承分享传统人力资源企业互联网+实践 | V课堂第26期
- 大数据怎样改变备份与恢复的游戏规则?——移动·开发技术周刊第 198 期
- 陆建豪:传统品牌电商战略转型在新零售新电商中的探索 | V 课堂第 25 期
- 高能预警!各路大神火速奔赴8月WOT2016移动互联网技术峰会
- 十款免费 Web 设计软件最佳盘点
- 2016 华为开发者大赛沙龙深圳站:汇聚创新 共筑未来
- 大数据领域12大动向你应知晓_移动·开发技术周刊第199期
- 多因素验证技术的五大颠覆性发展趋势
- 2016上半年最具潜力的五款框架选项 | 移动·开发技术周刊第200期
- 达沃时代阳立堂:超融合未来并非仅限改造数据中心
- 耿峰讲解实战数字化制造 | V课堂第27期
- 陈小兵构建工业4.0软件与服务研究 | V课堂第28期
- 无服务器计算的真正含义为何?
- 2016 年已消逝的技术产品
- 构建敏锐洞察移动应用数据开源基础的方法