插入、冒泡、快排、选择排序算法python2代码实现(另一种实现,看起来更简洁)

目录

一、插入排序

二、冒泡排序

三、快排(递归)

四、选择排序

一、插入排序(O(n^2))

def insert(test_list):
    for i in range(1, len(test_list)):
        index =  i -1
        while index >= 0 and test_list[i] < test_list[index]:
            # 只有 要插入的值 小于 已经排好序的数组中的数,也就是后面的数较小的时候才进行处理,以下几种方法理念同此
            test_list[i], test_list[index] = test_list[index], test_list[i]
            i = index
            index -= 1
    return test_list

二、冒泡排序

def bubble_sort(test_list):
    length = len(test_list)
    for i in range(length):
        flag = True
        # length - 1 为最后一位元素
        for j in range(length - 1 - i): # 每排一次,会有一个最大值在最后面,所以 - i
            if test_list[j] > test_list[j+1]:
                # 如果当前元素比后面的元素大,则一直往后移动
                # 5 3 9 1 -> 3 5 9 1 ->  3 5 1 9
                test_list[j], test_list[j+1] = test_list[j+1], test_list[j]
                flag = False
                # print(test_list)
        if flag:
            break
    return test_list

三、快排(递归 O(nlogn))

def kuaipai(test_list):
    """
    最优:快排有去重功能,循环或者迭代里变量赋值也要尽量少
    """
    if test_list == []:
        return []
    else:
        left = [i for i in test_list if i<test_list[0] ]
        right = [i for i in test_list if i>test_list[0] ]
        return kuaipai(left) + test_list[0:1] + kuaipai(right)

四、选择排序

def choose(test_list):
    length = len(test_list)
    for i in range(length):
        min_num_index = i # 假设test_list[j]为最小元素
        for j in range(i + 1, length):
            if test_list[j] < test_list[min_num_index]:
                # 此处相反,每次找出最小元素的位置
                min_num_index = j
        test_list[min_num_index], test_list[i] = test_list[i], test_list[min_num_index] # 把当前找到的最小元素放到前面
    return test_list

五、归并排序(适合大规模数据排序)

def mergeArray(test_list):
    if len(test_list) <= 1:
        return test_list
        
    mid = len(test_list) // 2
    left = mergeArray(test_list[:mid])
    right = mergeArray(test_list[mid:])
    return merge(left, right)

def merge(nums1, nums2):
    # 合并 2 个有序数组
    res = []
    left, right = 0, 0
    while left < len(nums1) and right < len(nums2):
        if nums1[left] < nums2[right]:
            res.append(nums1[left])
            left += 1
        else:
            res.append(nums2[right])
            right += 1
    
    res.extend(nums1[left:])
    res.extend(nums2[right:])
    return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值