NB二人组----快排

快速排序

快排的思路:

快速排序代码--第一步

怎么写partition函数?

import time
import random

def cal_time(func):            # 装饰器 ,用来检测算法所执行的时间
    def wrapper(*args,**kwargs):
        t1=time.time()
        result=func(*args,**kwargs)
        t2=time.time()
        print("%s running time: %s secs." %(func.__name__,t2-t1))
        return result
    return wrapper

def quick_sort_x(data,left,rigrt):   # 因为这个为递归 , 所以不能直接进行赋值 计算
    if left < rigrt : # 目的是让中间值 的 左边右边 不相碰
        mid = partition(data,left,rigrt)
        quick_sort_x(data,left,mid - 1)
        quick_sort_x(data,mid + 1,rigrt)

def partition(data,left,right):
    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 left

@cal_time
def quick_sort(data):
    return quick_sort_x(data,0,len(data) - 1)

data = list(range(1000))
quick_sort(data)
print(data)

算法所呈现的效果为:

bubble_sort running time: 0.3220186233520508 secs.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ···················985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999]

 快排的效率:

快排的问题:

 

1、问题

  在一些环境中,可能快排的速率比冒泡还慢

2、递归

 ----------------------------------

猜你喜欢

转载自www.cnblogs.com/zhuifeng-mayi/p/9212120.html
今日推荐