Python全栈开发 day6 - 常见排序算法

一、冒泡排序

# 冒泡排序
# 比较相邻两个元素a、b,若a>b则交换位置,一轮过后,最大值将排在列表最后
# 重复操作剩余的元素,直至排序完成

li = [23, 50, -3, 45, 0, 245, 1, -63]

def bubble_sort(li):
    for i in range(len(li)-1):
        for j in range(1, len(li)-i):
            if li[j-1] > li[j]:
                li[j-1], li[j] = li[j], li[j-1]
    return li

二、选择排序

# 选择排序
# 第一轮,在未排序列表中找到最小元素,放在列表第一位
# 重复操作剩余元素

li = [23, 50, -3, 45, 0, 245, 1, -63]

def select_sort(li):
    for i in range(len(li)-1):
        min = i     # 存放最小元素的下标
        for j in range(i+1, len(li)):
            if li[j] < li[min]:
                min = j
        li[i], li[min] = li[min], li[i]
    return li

三、插入排序

# 插入排序
# 第一轮:将第一个元素a看为已排序列表,取出下一个元素b,从后往前扫描,若b小于a,则将a后移一位,直至b>a,将b插入到a后
# 重复此操作,直至所有元素均已完成排序

li = [23, 50, -3, 45, 0, 245, 1, -63]

def insert_sort(li):
    for i in range(1, len(li)):
        x = li[i]       # 待排序的元素
        index = i       # 待排序元素插入位置
        for j in range(i-1, -1, -1):
            if x < li[j]:
                li[j+1] = li[j]
                index = j
            else:
                break
        li[index] = x

    return li

四、快排

# 快排
# 指定列表中任意一个数为基准数,将小于基准数的所有元素放在左边,大于基准数的所有元素放在右边
# 对左右区间进行递归操作

li = [23, 50, -3, 45, 0, 245, 1, -63]

def quick_sort(li):
    if len(li) <= 1:
        return li
    else:
        x = li[0]   # 基准数
        llist = [i for i in li[1:] if x > i]    # 找出所有小于基准数的元素组成一个列表
        rlist = [i for i in li[1:] if x < i]    # 找出所有大于基准数的元素组成一个列表
    return quick_sort(llist) + [x] + quick_sort(rlist)

五、二分查找算法(有序列表)

li = [-63, -3, 0, 1, 23, 45, 50, 245]

# 二分查找算法
def binary_search(li, item, left, right):
    if left > right:
        return None
    mid = (left+right)//2
    if item == li[mid]:
        return mid
    elif item < li[mid]:
        return binary_search(li, item, left, mid-1)
    else:
        return binary_search(li, item, mid+1, right)

if __name__ == "__main__":
    print(li)
    print(binary_search(li, 23, 0, len(li)-1))

猜你喜欢

转载自www.cnblogs.com/sharef/p/9440615.html