文章目录
- 冒泡排序
- 原理
- 复杂度 和 耗时
- 实现
- 选择排序
- 原理
- 复杂度 和 耗时
- 实现
冒泡排序
原理
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个的位置
- 每遍历一次, 就可以确定此次遍历的范围内, 最后一个元素为最大的
- 缩短遍历的结束位置, 重新比对前边的所有相邻的元素, 重复步骤 1
复杂度 和 耗时
实现
- go
func bubbleSort(s []int) []int {
l := len(s)
// 外层遍历: 作为遍历次数的计数器, 缩短内层遍历的长度
for i := 1; i < l; i++ {
// 内层遍历: 核心, 对比相邻两个元素, 如果符合条件就交换位置
// 优化方案: 如果遍历一次, 位置都没有发生变化, 则可以确定排序完成, 后边的不需要执行了
for j := 0; j < l-i; j++ {
if s[j] > s[j+1] {
s[j], s[j+1] = s[j+1], s[j]
}
}
}
return s
}
- python
"""
外层遍历只是作为计数器, 用于控制内层遍历的元素长度
内层遍历是核心, 内层遍历是对比相邻两个元素, 如果符合条件就交换位置
交换位置时, 一定是使用内层的遍历索引
"""
def bubble_sort(l):
c = len(l)
# 外层遍历: 作为遍历次数的计数器, 缩短内层遍历的长度
for j in range(1, c):
# 内层遍历: 核心, 对比相邻两个元素, 如果符合条件就交换位置
# 每一次遍历都可以保证最后一个元素为最大
for i in range(c-j):
# 用内部循环索引操作列表, 不要写错
if l[i] > l[i+1]:
l[i], l[i+1] = l[i+1], l[i]
return l
选择排序
原理
- 将第一个元素作为对比元素, 再用后边的每一个元素和他做比对
- 找到最小的元素索引, 让它和第一个元素位置对调
- 每次遍历都可以将最小的放到第一位
复杂度 和 耗时
实现
- go
func selectSort(s []int) []int {
// 求长度
l := len(s)
// 从第一个元素开始遍历, 用该元素作为对比元素
for i := 0; i < l; i++ {
// min 表示最小元素的索引
min := i
// 从 i+1 位置开始遍历, 和 min 的元素进行对比
// 如果遍历的元素小于 s[min], 将遍历元素的索引赋值给 min
// 后续的元素继续对比, 直到遍历结束, 找到最小的元素
for j := i + 1; j < l; j++ {
if s[j] < s[min] {
min = j
}
}
s[i], s[min] = s[min], s[i]
}
return s
}
- python
def select_sort(l):
c = len(l)
for i in range(c):
# 最小的元素索引为 i
min = i
# 循环后边所有的元素, 对比索引 min 和索引 j, 找到最小的元素, 和索引 i 调换位置
for j in range(i+1, c):
if l[j] < l[min]:
min = j
l[i], l[min] = l[min], l[i]