文章目录

  • 冒泡排序
  • 原理
  • 复杂度 和 耗时
  • 实现
  • 选择排序
  • 原理
  • 复杂度 和 耗时
  • 实现



冒泡排序

原理

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个的位置
  • 每遍历一次, 就可以确定此次遍历的范围内, 最后一个元素为最大的
  • 缩短遍历的结束位置, 重新比对前边的所有相邻的元素, 重复步骤 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]