python数据结构的多种排序算法

# 选择排序法
def selection_sort(my_list):
    i = 0
    while i < len(my_list):
        min_index = i
        j = i + 1
        while j < len(my_list):
            if my_list[j] < my_list[min_index]:
                min_index = j   # 该循环主要用于搜索当前列表的最小值

            j += 1
        if my_list[min_index] != my_list[i]:  # 如果最开始我们假设的第一个位置的值并不是最小值,就将俩交换
            my_list[min_index], my_list[i] = my_list[i], my_list[min_index]

        i += 1



# 冒泡排序法
def bubble_sort(my_list):
    n = len(my_list)
    swapped = False
    while n > 1:
        i = 1
        while i < n:
            if my_list[i] < my_list[i - 1]:
                my_list[i], my_list[i - 1] = my_list[i - 1], my_list[i]
                swapped = True
            i += 1
        n -= 1          


# 插入排序法
def insert_sort(my_list):
    num = 1
    while num < len(my_list):
        i = num - 1
        need_item = my_list[num]
        while i >= 0:
            if need_item < my_list[i]:
                my_list[i + 1] = my_list[i]
                i -= 1
            else:
                break
        my_list[i + 1] = need_item
        num += 1


# ========================快速排序=====================
def quick_sort(my_list):
    quick_helper(my_list, 0, len(my_list) - 1)


def quick_helper(lyst, left, right):
    """递归调用方法"""
    if left < right:  # 判断分割好的方向的个数是否小于2
        boudary = get_boundary_postion(lyst, left, right)  # 获取边界点的位置
        quick_helper(lyst, left, boudary - 1)  # 左边的子列表
        quick_helper(lyst, boudary + 1, right)  # 右边的子列表


def get_boundary_postion(lyst, left, right):
    """
    获取分界点的位置
    :param lyst: 列表或者子列表
    :param left: 开头位置
    :param right: 结束位置
    return: 返回边界点的位置
    """
    middle = (left + right) // 2  # 获取中间位置 '//'是取商
    datum_point = lyst[middle]  # 选择中间位置为基准点
    lyst[middle] = lyst[right]  # 将基准点和结束位置进行交换
    lyst[right] = datum_point
    boudary = left  # 在列表的最前面设置一个边界点
    for i in range(left, right):
        if lyst[i] < datum_point:  # 遍历查找第一个小于基准点的值
            lyst[boudary], lyst[i] = lyst[i], lyst[boudary]  # 交换边界点与查找到的值得位置
            boudary += 1
    # 将边界点的下一个位置的点与已经在最后的基准点交换,
    # 这个时候基准点右边就全是小于基准点的值, 左边是大于的
    lyst[boudary], lyst[right] = lyst[right], lyst[boudary]  
    return boudary


# ==================合并排序======================
def merge_sort(my_list):
    """排序的主要方法"""
    copy_lyst = my_list.copy()
    merge_helper(my_list, copy_lyst, 0, len(my_list)-1)


def merge_helper(lyst, copy_lyst, left, right):
    """递归函数"""
    if left < right:
        middle = (left + right) // 2
        merge_helper(lyst, copy_lyst, left, middle)
        merge_helper(lyst, copy_lyst, middle+1, right)
        merge_(lyst, copy_lyst, left, middle, right)


def merge_(lyst, copy_lyst, left, middle, right):
    """
    合并函数
    :param lyst --原始列表
    :param copy_lyst --一个和原始列表具有相同大小的列表
    :param left  --起始位置
    :param middle --中值
    :param right --结束位置
    """
    i1 = left  # 左边子列表的起始值,
    i2 = middle + 1  # 右边子列表的起始值
    for i in range(left, right + 1):
        if i1 > middle:
            copy_lyst[i] = lyst[i2]
            i2 += 1
        elif i2 > right:
            copy_lyst[i] = lyst[i1]
            i1 += 1
        elif lyst[i1] < lyst[i2]:  # 比较两个子列表的最小值
            copy_lyst[i] = lyst[i1]
            i1 += 1
        else:
            copy_lyst[i] = lyst[i2]
            i2 += 1

    for i in copy_lyst:
        lyst[i] = copy_lyst[i]




num = [1, 3, 4, 2, 1]
merge_sort(num)
print(num)

其实既然使用python来实现排序算法,在实现两个位置交换的功能中,我应该也使用底层的方式,而不是使用python已经写好的交换方式

def swapped(lyst, index1, index2):
    temp = lyst[index1]
    lyst[index1] = lyst[index2]
    lyst[index2] = temp
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值