算法

文章目录

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


冒泡排序

原理

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个的位置
  • 每遍历一次, 就可以确定此次遍历的范围内, 最后一个元素为最大的
  • 缩短遍历的结束位置, 重新比对前边的所有相邻的元素, 重复步骤 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(arg):
        l = len(arg)
    
    	# 外层遍历: 作为遍历次数的计数器, 缩短内层遍历的长度
        for j in range(1, l):  
        	# 内层遍历: 核心, 对比相邻两个元素, 如果符合条件就交换位置
        	# 每一次遍历都可以保证最后一个元素为最大
            for i in range(l-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]
    
    

你可能感兴趣的:(杂类)