常用排序算法(一)

本篇主要介绍排序算法中的冒泡排序 选择排序和插入排序

一 冒泡排序

1、思路:首先,列表每两个相邻的数比较大小,如果前边的比后边的大,那么这两个数就互换位置。就像是冒泡一样

2、代码关键点:

  • 趟数:n-1趟
  • 无序区

3、图示说明:依次类推就会得到排序结果。冒泡排序的效率还是很低的

时间复杂度:O(n2)

常用排序算法(一)

实现代码:

def bubble_sort2(data_list):
'''
首先, 列表每两个相邻的数如果前边的比后边的大, 那么交换这两个数
算法复杂度O(n²)
关键点:趟 无序区
:param data_list:
:return:
'''

for i in range(0, len(data_list) - 1):
# i 表示第i趟 有序区有i个数
exchange = False
for j in range(0, len(data_list) - i - 1):
if data_list[j] > data_list[j + 1]:
data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
exchange = True
if not exchange: # 如果在1趟没有进行交换证明已经排好序了 提前终止
return

二 选择排序

1、思路:一趟遍历完记录最小的数,放到第一个位置;在一趟遍历记录剩余列表中的最小的数,继续放置

2、代码关键点:

  • 无序区
  • 最小数的位置

时间复杂度:O(n2)

def select_sort(li):
    for i in range(0, len(li) - 1):
        # 第i趟 有序区范围:[0:i] 无序区范围:[i:n]
        min_loc = i  # 最小数
        for j in range(i + 1, len(li)):
            if li[min_loc] > li[j]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]

三 插入排序

1、思路:元素被分为有序区和无序区两部分。最初有序区只有一个元素。每次从无序区中选择一个元素,插入到有序区的位置,直到无序区变空。

2、代码关键点:

  • 摸到的牌
  • 手里的牌

3、图示说明

常用排序算法(一)

插入后:

常用排序算法(一)

常用排序算法(一)

常用排序算法(一)

实现代码

'''
推算过程 li = [10,5,7,9,8,3 ]
第一趟:i = 1 j = 0 tmp = 5  条件满足j>=0  并且 li[j](10) > tmp(5) 进入循环 li[j+1](5) = li[j](10) j=-1 [5,10,7,9,8,3]
第二趟:i = 2 j = 1 tmp = 7  条件满足j>=0  并且 li[j](10) > tmp(7) 进入循环 li[j+1](7) = li[j](10) j=0 [5,7,10,9,8,3] 
第三趟: i = 3 j = 2 tmp = 9  条件满足j>=0  并且 li[j](10) > tmp(9) 进入循环 li[j+1](9) = li[j](10) j=1 [5,7,9,10,8,3]
第四趟:i = 4 j = 3 tmp = 8  条件满足j>=0  并且 li[j](10) > tmp(8) 进入循环 li[j+1](8) = li[j](10) j=2 [5,7,9,8,10,3] 再次满足 条件满足j>=0  并且 li[j](9) > tmp(8) 进入循环 li[j+1](8) = li[j](9) j=1 [5,7,8,9,10]

'''
def insert_sort(li):
    for i in range(1, len(li)):
        # i即表示趟数,也表示摸到的牌的下标
        # j表示手里最后一张牌
        j = i - 1
        tmp = li[i]
        while j >= 0 and li[j] > tmp:
            li[j + 1] = li[j]
            j -= 1
        li[j + 1] = tmp