zoukankan      html  css  js  c++  java
  • 快速排序算法

    快速排序算法

    快排思路:

      取一个元素p(第一个元素),使元素p归位;

      列表被p分成两部分,左边都比p小,右边都比p大;

      递归完成排序。

    时间复杂度为:

      O(nlogn)

    import random
    import time
    
    def cal_time(func):
        """
        测试时间装饰器
        :param func: 接收一个函数
        :return:
        """
        def wrapper(*args, **kwargs):
            ti = time.time()
            x = func(*args, **kwargs)
            ti2 = time.time()
            print("time cost:", func.__name__, ti2 - ti)
            return x
        return wrapper
    
    
    def quick_sort_x(data, left, right):
        if left < right:
            # 将left位置的数字,归位
            mid = partition(data, left, right)
            # 递归操作
            quick_sort_x(data, left, mid - 1)
            quick_sort_x(data, mid + 1, right)
    
    
    def partition(data, left, right):
        """
        实现归位操作
        :param data: 无序列表
        :param left: 列表左边下标
        :param right: len(data) - 1
        :return:排序后的列表
        """
        tmp = data[left]
        while left < right:
            while left < right and data[right] >= tmp:
                right -= 1
            data[left] = data[right]
            while left < right and data[left] <= tmp:
                left += 1
            data[right] = data[left]
        data[left] = tmp
        return right
    
    
    @cal_time
    def quick_sort(data):
        return quick_sort_x(data, 0, len(data) - 1)
    
    da = list(range(10000))
    random.shuffle(da)
    quick_sort(da)
    print(da)
  • 相关阅读:
    select和epoll的区别
    Epoll导致的selector空轮询
    2.集合框架中的泛型有什么优点?
    java的语法基础(二)
    17-文本属性和字体属性
    15-浮动
    16-margin的用法
    14-块级元素和行内元素
    12-简单认识下margin
    day15 什么是递归/递归与回溯
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/6520351.html
Copyright © 2011-2022 走看看