冒泡排序:
''' 冒泡排序:时间复杂度O(n²) 相邻两个数比较 一趟冒一个最大(或最小)的数到最上面 每一趟无序区减少一个数,有序区增加一个数 ''' def bubble_sort(li): for i in range(len(li) - 1): # 冒泡n-1次排序完成 flag = False for j in range(len(li) - 1 - i): # 每次冒泡比较的次数 if li[j] > li[j + 1]: li[j], li[j + 1] = li[j + 1], li[j] flag = True if not flag: return
选择排序:
''' 选择排序:时间复杂度O(n²) 分为无序区和有序区 假设列表长度为n,一共n-1个值跟无序区的值比较(最后一个值不用比了),比较n-1次 第一次拿列表第一个值和后面的值比较,找出最小的,跟索引0处的元素进行交换 第二次拿列表第二个值和后面的值比较,找出最小的,跟索引1处的元素进行交换 第三次拿列表第三个值和后面的值比较,找出最小的,跟索引3处的元素进行交换 ... 第n-1次拿列表第n-1个值后面的值比较,找出最小的,跟索引n-1处的元素进行交换 这样下来,最后一个元素一定是最大的,就不管了 ''' li = [4, 5, 3, 6, 2, 7, 9, 8, 1] def select_sort(li): for i in range(len(li)-1): # 取一个元素进行比较,共n-1个元素要进行比较 min_loc = i # 标记本趟最小值的索引,初始值为i for j in range(i+1, len(li)): # 每一趟的比较找出最小值,跟第一个值交换,下次只跟后面的值比较 if li[min_loc] > li[j]: # 有比min_loc小的,就替换min_loc min_loc = j li[i], li[min_loc] = li[min_loc], li[i]
插入排序:
''' 插入排序:时间复杂度O(n²) 类似摸牌,先拿列表第一个元素在手里 从剩下的元素里依次取元素,依次跟手里的元素比较, 如果比手里元素小,就挪动手中元素位置。 最后把元素插入 ''' def insert_sort(li): for i in range(1, len(li)): # i:摸到的牌的下标 j = i - 1 # j:手里的最后一张牌的下标 tmp = li[i] # 用临时变量保存摸到的牌,因为移动位置会进行覆盖 # 情况一:[2,4,6] 摸到3 j>=0 # 情况二:[2,4,6] 摸到1 j=-1 while j >= 0 and tmp < li[j]: # 这个循环干的事情是挪动元素位置 li[j + 1] = li[j] j -= 1 li[j + 1] = tmp