2020/7/30

一种快速排序算法的非递归实现(python版)

import numpy as np
import matplotlib.pyplot as plot
import copy
import time


def main():
    arr = [x for x in np.random.choice(10, 5000, replace=True)]
    arr_2 = copy.deepcopy(arr)
    
    b1 = time.clock()
    sort_2(arr_2, 0, len(arr)-1)
    e1 = time.clock()

    b2 = time.clock()
    sort(arr, 0, len(arr)-1)
    e2 = time.clock()

    plot.figure("sort")
    plot.subplot(221)
    plot.title(str(e1 - b1))
    plot.bar([x for x in range(len(arr))], arr)
    
    plot.subplot(222)
    plot.title(str(e2 - b2))
    plot.bar([x for x in range(len(arr_2))], arr_2)
    
    plot.show()

def sort(arr, left, right):
    stack = []
    if left >= right: return

    benckmark = partition(arr, left, right)
    if right - left <= 1: return

    stack.append([left, benckmark-1])
    stack.append([benckmark+1, right])

    while len(stack) != 0:
        e = stack.pop()
        if (e[0] >= e[1]): continue
        tmp_benckmark = partition(arr, e[0], e[1])

        stack.append([e[0], tmp_benckmark-1])
        stack.append([tmp_benckmark+1, e[1]])

def sort_2(arr, left, right):
    stack = []
    if left >= right: return
    i, j = partition_2(arr, left, right)

    stack.append([left, i-1])
    stack.append([j+1, right])

    while len(stack) != 0:
        e = stack.pop()
        if e[0] >= e[1]:continue
        tmp_i, tmp_j = partition_2(arr, e[0], e[1])
        stack.append([e[0], tmp_i-1])
        stack.append([tmp_j+1, e[1]])

def partition_2(arr, left, right):
    b = arr[left]
    i,m,j = left, left+1, right

    while m<=j:
        if b == arr[m]: m=m+1
        elif b > arr[m]: 
            arr[m], arr[i] = arr[i], arr[m]
            m = m+1
            i = i+1
        elif b < arr[m]:
            arr[m], arr[j] = arr[j], arr[m]
            j = j-1
    
    return i,j

def partition(arr, left, right):
    benchmark = arr[left]

    i, j = left+1, right

    while True:
        while benchmark >= arr[i]:
            i = i+1
            if i >= right: break
        
        while benchmark < arr[j]:
            j = j-1
            if j <= left: break
        
        if i >= j: break
        arr[i], arr[j] = arr[j], arr[i]
    arr[left], arr[j] = arr[j], arr[left]
    return j

if __name__ == '__main__':
    main()
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值