Go 冒泡排序 ( Bubble Sort )
SeaConch · · 2301 次点击 · · 开始浏览冒泡排序
冒泡排序 ( Bubble Sort ),是排序算法中最简单的一种
一般都是我们新了解一门语言时拿来练手使用
今天也不例外,虽然用 C# 写过无数次的冒泡排序,但是毕竟换了一门语言,所以有必要再来实现一次
原理
1.冒泡
既然决定写文章记录,那么就要好好的写
我们说冒泡排序简单,那么为什么简单呢?就是因为容易理解
冒泡 Bubble,如其意,就像气泡一样,他会慢慢的从海底浮出水面
那么这一层一层的浮现也是我们冒泡排序的实现方式
2.原理
假设我们有如此数组 :
7 2 9 22 16 93 202 0 33 29 84
一共是 11 个数字
我们先给数字加上下标
7[0] 2[1] 9[2] 22[3] 16[4] 93[5] 202[6] 0[7] 33[8] 29[9] 84[10]
这里我们先假设要对数组进行从小到大的排序
那么首先:
- 最小的数字应该在第一位
那如何保证最小的数字在第一位呢?
其实就是谁小谁来的道理
3.思路
1.我们拿第一位 [0] 也就是 7 依次向后方数字做比较,直到出现比 7 小的数字后,将该数字
与 7 交换位置
如:第二位 [1] 也就是 2 就比 7 小,那么 [0] 位置由 2 来占据, 7 暂居第二位 [1]
2.此时数组 [0] 为 2 ,再按照 1. 中方式依次向后比较
3.当 [7] 0 时, 再次满足交换条件,2 与 0 交换位置
4.最终确认 0 即最小值 ,那么第一位置确认,就是 0
5.下一步确认第二位 [1] 值 ... 重复上述步骤
图片描述
代码
// 冒泡
func Bubble_Sort(slice []int/* 带排序的切片 */, order bool/* true : 正序; false : 倒序; */) {
/*
1. 本循环代表 依次与其后所有数作比较的索引
2. 由于最后一个数不用比较,所以 len(slice) - 1
*/
for i := 0; i < len(slice) - 1; i++ {
// 本循环代表 外层将要与哪一位作比较
for k := i +1; k < len(slice); k++ {
if (slice[i] > slice[k] && order) /* 从大到小 */ || (slice[i] <= slice[k] && !order ) /* 从小到大 */ {
slice[i], slice[k] = slice[k], slice[i]
}
}
}
}
结果
排序结果如图所示
图片描述
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
冒泡排序
冒泡排序 ( Bubble Sort ),是排序算法中最简单的一种
一般都是我们新了解一门语言时拿来练手使用
今天也不例外,虽然用 C# 写过无数次的冒泡排序,但是毕竟换了一门语言,所以有必要再来实现一次
原理
1.冒泡
既然决定写文章记录,那么就要好好的写
我们说冒泡排序简单,那么为什么简单呢?就是因为容易理解
冒泡 Bubble,如其意,就像气泡一样,他会慢慢的从海底浮出水面
那么这一层一层的浮现也是我们冒泡排序的实现方式
2.原理
假设我们有如此数组 :
7 2 9 22 16 93 202 0 33 29 84
一共是 11 个数字
我们先给数字加上下标
7[0] 2[1] 9[2] 22[3] 16[4] 93[5] 202[6] 0[7] 33[8] 29[9] 84[10]
这里我们先假设要对数组进行从小到大的排序
那么首先:
- 最小的数字应该在第一位
那如何保证最小的数字在第一位呢?
其实就是谁小谁来的道理
3.思路
1.我们拿第一位 [0] 也就是 7 依次向后方数字做比较,直到出现比 7 小的数字后,将该数字
与 7 交换位置
如:第二位 [1] 也就是 2 就比 7 小,那么 [0] 位置由 2 来占据, 7 暂居第二位 [1]
2.此时数组 [0] 为 2 ,再按照 1. 中方式依次向后比较
3.当 [7] 0 时, 再次满足交换条件,2 与 0 交换位置
4.最终确认 0 即最小值 ,那么第一位置确认,就是 0
5.下一步确认第二位 [1] 值 ... 重复上述步骤
图片描述
代码
// 冒泡
func Bubble_Sort(slice []int/* 带排序的切片 */, order bool/* true : 正序; false : 倒序; */) {
/*
1. 本循环代表 依次与其后所有数作比较的索引
2. 由于最后一个数不用比较,所以 len(slice) - 1
*/
for i := 0; i < len(slice) - 1; i++ {
// 本循环代表 外层将要与哪一位作比较
for k := i +1; k < len(slice); k++ {
if (slice[i] > slice[k] && order) /* 从大到小 */ || (slice[i] <= slice[k] && !order ) /* 从小到大 */ {
slice[i], slice[k] = slice[k], slice[i]
}
}
}
}
结果
排序结果如图所示
图片描述