数据结构-学习笔记-快速排序

快速排序

  • 左右指针的位置
  • 递归
  • 一般复杂度 O(nlogn) 每一层复杂度O(n),共有logn层
  • 最坏复杂度O(n^2) 优化,随机选择一个数与第一个数交换位置
  • 先选择一个数(可以是第一个数,也可以是其他位置的数,再跟第一个数交换位置)
  • 从右边选择比其小的数放在左边指针位置,从左边选择比其大的数放置右边指针位置处,终止条件
  • 算法框架
    def Quick_sort(li,left,right):
       终止条件(基例)
       mid = partion(li,left,right)
       Quick_sort(li,left,mid-1)
       Quick_sort(li,mid+1,right)

在这里插入图片描述

def partion(li,left,right):
    tem = li[left] # 选取一个临时值
    while left < right:
        while li[right] >= tem and left < right: # 从右选择小于tem的值
            right -= 1
        li[left] = li[right] # 放置左侧指针位置
        while li[left] <= tem and left < right: # 从左侧选择大于tem的值
            left += 1 
        li[right] = li[left] # 放置右侧指针的位置
    li[left] = tem
    return left

def Quick_sort(li,left,right):
    if left < right:
        mid = partion(li,left,right)
        Quick_sort(li,left,mid-1)
        Quick_sort(li,mid+1,right)
        
li = [5,3,6,8,2,9,4,1,7]
Quick_sort(li,0,len(li)-1)
print(li)

# result
[1, 2, 3, 4, 5, 6, 7, 8, 9]
时间复杂度对比
# 计算时间(函数)
import time 

def cal_time(func):
    def warpper(*args,**kwargs):
        t1 = time.time()
        result = func(*args,**kwargs)
        t2 = time.time()
        print("%s running time: %f secs." % (func.__name__, t2-t1))
        return result
    return warpper
import sys
import copy
import random

sys.setrecursionlimit(100000000) # 设置递归最大深度

@cal_time
def Bubble_sort(li):
    for i in range(len(li)-1):
        exchange = False
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        if not exchange:
            return
        
@cal_time
def _quick_sort(li):
    Quick_sort(li,0,len(li)-1)
    
li = list(range(1,10000))
random.shuffle(li)
li_1 = li.copy()
li_2 = li.copy()
Bubble_sort(li_1)
_quick_sort(li_2)

# result
Bubble_sort running time: 15.812118 secs.
_quick_sort running time: 0.029923 secs.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值