Go语言归并排序算法实现
时间:2022-05-05
本文章向大家介绍Go语言归并排序算法实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法导论的伪代码:
MERGE 函数是合并两个已经排好序的序列。
下面的输入参数:A是一个数组,p,q和r是数组下标,满足 p<=q<=r。下面的函数假设子数组 A[p…q] 和 A[q+1...r]都是已经拍好序的。这个函数将这两个子数组合并成数组A[p...r]
下面的函数MERGE-SORT排序子数组A[p...r]中的元素,如果p>=r,则该子元素最有有一个元素,所以是已经排好序的。否则,分解步骤简单的计算一个下标q,将A[p...r]分成两个子数组A[p...q]和A[q+1...r]。
Go语言的实现代码:
package main
import "fmt"
func main(){
arr01:=[]int{34,45,3,6,76,34,46,809,92,8}
fmt.Print("排序前")
fmt.Println(arr01)
mergeSort(arr01,0,len(arr01)-1)
fmt.Print("排序后")
fmt.Println(arr01)
}
fund merge1(arr []int,low,mid,high int){
leftLen:=mid-low+1
rightLen:=high-mid
arrLeft:=make([]int,leftLen+1)
for i:=0;i<leftLen;i++{
arrLeft[i]=arr[low+i]
}
arrLeft[leftLen]=99999//哨兵牌
arrRight:=make([]int,rightLen+1)
forj:=0;j<rightLen;j++{
arrRight[j]=arr[mid+j+1]
}
arrRight[rightLen]=99999//哨兵牌
i,j:=0,0
for k:=low;k<=high;k++{
if arrLeft[i]<=arrRight[j]{
arr[k]=arrLeft[i]
i++
}else{
arr[k]=arrRight[j]
j++
}
}
}
fund mergeSort(arr []int,low,high int){
if low<high{
mid:=(low+high)/2
mergeSort(arr,low,mid)
mergeSort(arr,mid+1,high)
merge1(arr,low,mid,high)
}
}
上面merge代码中,我们可以发现在两个辅助的最后均加入了一个较大的数,即为判断的“哨兵牌”。这样当最后进行循环操作时,每当露出一张“哨兵牌”,程序可以知道该循环已经要结束了。因为“哨兵牌”不可能是两张中较小的,除非另一个数组也出现了“哨兵牌”。如果两个数组均出现了“哨兵牌”,那么就说明了所有的元素都已经放入了数组a中了,而由于数组a的大小限制,循环已经结束了。如果没有设置“哨兵牌”,可能导致一个数组已经没有了元素,而另外一个数组还有一个元素没有放入a中,那么循环中的if判断语句就会失败,直接跳转执行else里面的语句,会导致结果出错。
如果不使用“哨兵牌”,我们同样可以实现merge所做的任务。代码如下:
主要逻辑就是一旦数据 left ,right 所有元素被复制回 arr,就立即停止循环,然后再用一个循环把另外的数组剩余部分复制过去。
可以参考:http://www.cnblogs.com/xjeternity/archive/2011/4/21.html
fund merge2(arr []int,low,mid,highint){
leftLen:=mid-low+1
rightLen:=high-mid
arrLeft:=make([]int,leftLen)
for i:=0;i<leftLen;i++{
arrLeft[i]=arr[low+i]
}
arrRight:=make([]int,rightLen)
for j:=0;j<rightLen;j++{
arrRight[j]=arr[mid+j+1]
}
i,j,k:=0,0,low
for ;k<=high&&i<leftLen&&j<rightLen;k++{
if arrLeft[i]<=arrRight[j]{
arr[k]=arrLeft[i]
i++
}else{
arr[k]=arrRight[j]
j++
}
}
for ;i<leftLen&&k<=high;k++{
arr[k]=arrLeft[i]
i++
}
for ;j<rightLen&&k<=high;k++{
arr[k]=arrRight[j]
j++
}
}
参考资料:
http://www.cnblogs.com/lxy15329/archive/2013/01/24/sort.html
http://www.cnblogs.com/tonykong/archive/2013/02/05/merge_sort.html
http://www.cnblogs.com/xjeternity/archive/2011/4/21.html
- mongodb11天之屠龙宝刀(六)mapreduce:mongodb中mapreduce原理与操作案例
- 真实场景的虚拟视点合成(View Synthsis)详解
- mongodb11天之屠龙宝刀(七)functions: mongodb 执行 functions入门案例
- 真实场景的双目立体匹配(Stereo Matching)获取深度图详解
- mongodb11天之屠龙宝刀(八)聚合函数与管道:sql与mongodb聚合函数对比
- Java基础-day04-基础题
- OpenCV亚像素角点cornerSubPixel()源代码分析
- mongodb11天之屠龙宝刀(十) 备份 还原 导出 导入::CSV,JSON,BOSN,解决中文乱码
- 【Go 语言社区】 golang 算法课程 第一季 第2节 洗牌算法
- 一条update语句的优化探索(r9笔记第80天)
- OpenCV角点检测源代码分析(Harris和ShiTomasi角点)
- Java基础-day03-代码题
- mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改
- Go语言社区 APP --问答模块数据存储流程及代码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 树莓派基础实验13:雨滴探测传感器实验
- Java中的TCP通信程序
- Java实现一个简单的文件上传案例
- 树莓派基础实验14:PS2操纵杆实验
- Java反射
- Java Request(域对象+请求转发+原理)详解
- PHP命令执行学习总结
- win10 专业版 提示开机提示你的windows许可证即将过期
- 浅谈文件上传漏洞(其他方式绕过总结)
- 《sql必知必会》——读书笔记(1)
- JDK15已发布,网友:我还在JDK8踏步走...
- 树莓派基础实验15:电位器传感器实验
- java JDBC数据库连接池技术(Druid ,c3p0)
- Fail to start qos server: dubbo version: current host: java.net.BindException:
- JAVA JDBC Template的使用