快速排序 及与冒泡排序比较

快速排序基本思路

1、先从数列中取出一个数作为基准数

2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

3、再对左右区间重复第二步,直到各区间只有一个数

快排操作过程

import random
def partition(arr,left,right):
    tmp = arr[left]
    while left < right:
        while left<right and arr[right] >=tmp:#从右边找找比tmp小的数
            right -= 1 #向左移1位
        arr[left] = arr[right]#把右边的值写到左边空位上
        print(arr,'right')
        while left<right and arr[left] <= tmp:
            left += 1
        arr[right] = arr[left]#把左边的值写到右边空位上
        print(arr,'left')
    arr[left]=tmp #把tmp归位

    return left
arr=[random.randint(0,10000) for i in range(10)]
print('----------------------左右互换操作-----------------------')
print(arr)
partition(arr,0,len(arr)-1)
print(arr)

print('-----------------------快排操作-------------------------')
def quick_sort(arr,left,right):  
    if left < right: #至少两个元素
        mid = partition(arr,left,right)  
        quick_sort(arr,left,mid-1)  
        quick_sort(arr,mid+1,right) 


quick_sort(arr,0,len(arr)-1)

代码实现

import random
def partition(arr,left,right):
    tmp = arr[left]
    while left < right:
        while left<right and arr[right] >=tmp:#从右边找找比tmp小的数
            right -= 1 #向左移1位
        arr[left] = arr[right]#把右边的值写到左边空位上
        while left<right and arr[left] <= tmp:
            left += 1
        arr[right] = arr[left]#把左边的值写到右边空位上  
    arr[left]=tmp #把tmp归位
    return left
def quick_sort(arr,left,right):  
    if left < right: #至少两个元素
        mid = partition(arr,left,right)  
        quick_sort(arr,left,mid-1)  
        quick_sort(arr,mid+1,right) 

arr = [random.randint(0,10000) for i in range(10)]

quick_sort(arr,0,len(arr)-1)
print(arr)

快速排序的效率

时间复杂度O(nlog(n))

快排与冒泡排序的比较

计算执行时间函数代码(execution_time.py)

import time

def execution_time(func):
	def wraper(*args,**kwargs):
		t1 = time.time()
		result = func(*args,**kwargs)
		t2 = time.time()
		print('%s running time %s second' % (func.__name__, t2-t1))
		return result
	return wraper

执行时间比较函数

from execution_time import * 
import random 
import copy

#冒泡排序
@execution_time
def bubble_sort(arr):
    n = len(arr)
    for i in range(n-1):
        exchange = True#交换为
        for j in range(n-i-1):
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]  
                exchange = False        
        print(arr)
        if exchange:
            return

#快速排序
def partition(arr,left,right):
    tmp = arr[left]
    while left < right:
        while left<right and arr[right] >=tmp:#从右边找找比tmp小的数
            right -= 1 #向左移1位
        arr[left] = arr[right]#把右边的值写到左边空位上
        while left<right and arr[left] <= tmp:
            left += 1
        arr[right] = arr[left]#把左边的值写到右边空位上  
    arr[left]=tmp #把tmp归位
    return left

def _quick_sort(arr,left,right):  
    if left < right: #至少两个元素
        mid = partition(arr,left,right)  
        _quick_sort(arr,left,mid-1)  
        _quick_sort(arr,mid+1,right) 

@execution_time
def quick_sort(arr):
    _quick_sort(arr,0,len(arr)-1)


arr = list(range(10000))
random.shuffle(arr)

arr1 = copy.deepcopy(arr)#深拷贝
arr2 = copy.deepcopy(arr)

bubble_sort(arr1)
quick_sort(arr2)
print(arr1)
print(arr2)

快速排序的问题:

  • 最坏情况(倒序排序的列表,每次只少一个数,时间复杂度为O(n**2))
  • 递归(浪费系统资源)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonhhxg_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值