算法之排序之一

1. 排序

将一组无序的记录序列调整为有序的记录序列
输入无序列表,输出有序列表
常见算法:冒泡,选择,插入,快速,堆,归并,希尔,计数,基数

2. 冒泡排序

列表每相邻的数,如果前面比后面大,则交换这两个数
遍历一次列表后,无序区减少一个数,有序区增加一个数,一共遍历n-1遍
时间复杂度:O(n2)

def bubble_sort(li):
    for i in range(len(li) - 1):  # 第i趟
        exchange = 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]
                exchange = True
        if not exchange:
            return

3. 选择排序

遍历无序区,找到最小的一个数,与无序区第一个数交换,遍历n-1遍
时间复杂度:O(n2)

def select_sort(li):
    for i in range(len(li) - 1):  # i是第几趟
        min_loc = i
        for j in range(i + 1, len(li)):  # 遍历无序区
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]

4. 插入排序

类似摸牌
无序区最左边的一个数跟有序区的最右边比较,有序区的大,这个数就往右边移动,再跟有序区右边第二个数比较
时间复杂度:O(n2)

def insert_sort(li):
    for i in range(1, len(li)):  # i表示摸到的牌的下标,手上一张,从第二张开始
        tmp = li[i]
        j = i - 1  # j指的是手里最右边的牌的下标,开始是第一张
        while li[j] > tmp and j >= 0:  # 手上牌最大的那张比摸到的大
            li[j + 1] = li[j]  # 手上牌往右挪一位
            j -= 1  # 指针往左走
        li[j + 1] = tmp # 把摸到的牌插入
posted @ 2019-04-22 15:58  球球-Ball  阅读(126)  评论(0编辑  收藏  举报