python实现排序算法

这篇博客详细介绍了冒泡排序、选择排序、插入排序、希尔排序和归并排序这五种经典的排序算法,并分别提供了Python实现。此外,还通过归并排序进行了效率测试,生成了10万个随机数据进行排序,测试了排序算法的时间复杂度。
摘要由CSDN通过智能技术生成

冒泡排序

def maopao(array):
    for i in range(len(array)):
        for j in range(len(array) - i - 1):
            if array[j] > array[j + 1]:
                array[j], array[j + 1] = array[j + 1], array[j]
    return array

选择排序

def xuanze(array):
    for i, num in enumerate(array):
        min_index = i
        for j in range(i + 1, len(array)):
            if array[min_index] > array[j]:
                min_index = j
        if min_index != i:
            array[i], array[min_index] = array[min_index], array[i]
    return array

插入排序

def charu(array):
    result = []
    for index, num in enumerate(array):
        for i in range(index):
            if result[i] > num:
                result.insert(i, num)
                break
        else:
            result.append(num)
    return result

希尔排序

def shell(array):
    length = len(array) // 2
    while length != 1:
        array = charu_tap(array, length)
        length = length // 2
    else:
        return charu_tap(array, length)

def charu_tap(array, tap):
    result = []
    for index, num in enumerate(array):
        if index // tap >= 1:
            strat = index % tap
            for i in range(strat, index, tap):
                if result[i] > num:
                    result.append(num)
                    result[i], result[index] = result[index], result[i]
                    break
            else:
                result.append(num)
        else:
            result.append(num)
    return result

归并排序

def merge_sort(lst, fx=True):
    if len(lst) <= 1:
        # 当列表元素只有一个的时候,直接返回
        return lst
    mid = len(lst) // 2
    left = lst[:mid]
    right = lst[mid:]
    starttime = time.time()
    left = merge_sort(left, not fx)
    right = merge_sort(right, not fx)

    # 递归的进行排序
    result = []
    while left and right:
        if (left[-1] < right[-1]) == fx:
            result.append(left.pop())
        else:
            result.append(right.pop())
    if left:
        if fx and len(left) == 1:
            result.extend(left)
        else:
            left.reverse()
            result.extend(left)
    if right:
        if fx and len(right) == 1:
            result.extend(right)
        else:
            right.reverse()
            result.extend(right)

    return result
    # 返回排序后的结果

快速排序

class Sort:
	@staticmethod
    def quick_sort(sort_list, fir=None, last=None):
        """
        快速排序

        :param sort_list:
        :param fir:
        :param last:
        :return:
        """
        if fir is None and last is None:
            fir = 0
            last = len(sort_list) - 1

        if fir < last:
            sp = Sort._swap_position(sort_list, fir, last)
            Sort.quick_sort(sort_list, fir, sp - 1)
            Sort.quick_sort(sort_list, sp + 1, last)

	@staticmethod
    def _swap_position(arr, fir, last):
        pv = arr[fir]
        lm = fir + 1
        rm = last
        do = False
        while not do:
            while lm <= rm and arr[lm] <= pv:
                lm = lm + 1
            while arr[rm] >= pv and rm >= lm:
                rm = rm - 1
            if rm < lm:
                do = True
            else:
                temp = arr[lm]
                arr[lm] = arr[rm]
                arr[rm] = temp
        temp = arr[fir]
        arr[fir] = arr[rm]
        arr[rm] = temp
        return rm

效率测试代码

# 生成 10W数据
list_num = [i * random.random() for i in range(100000)]
# 打乱顺序
random.shuffle(list_num)
# 测试代码:归并测试
t5 = timeit.Timer("merge_sort(list_num,False)", "from __main__ import merge_sort,list_num")
# 测试次数 10次
print("test5", t5.timeit(number=10), "milliseconds")

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值