Python数据结构-----非递归实现快速排序

目录

前言:

非递归快排

1.概念原理

2.示例

 Python代码实现

非递归快速排序


前言:

        上一期我们学习了通过递归来实现快速排序的方法,那这一期我们就来一起学习怎么去通过非递归的方法来去实现快速排序的功能。(上一期连接Python数据结构-----递归实现快速排序_灰勒塔德的博客-CSDN博客

非递归快排

1.概念原理

         对于非递归来实现快排相较于递归效率更加高一些,但是代码量也相对增加了一些,如果要想通过非递归的方式去实现快排的话,这里就要用到数据结构栈或者队列的功能,栈和队列可以作为范围值的储存容器,当我们要对某一个范围里面的数据进行排序的时候就可以去取出来,如果有新的排序目标范围产生的话就可以把这个范围添加到里面去。

 原理过程

1. 最简单的实现快速排序的方法是利用递归来实现,如果要利用非递归的方法实现

2. 非递归的实现快速排序,可以利用栈来实现。其实递归的本质就是栈的先进后出的性质。

    利用快速排序每次是递归向左右子序列中进行排序,利用栈我们可以把左右子序列的端点值保存到栈中,然后每次取栈顶区间进行排序,直到栈为空则整个序列为有序

2.示例

(1)已有一组数据,对其进行排序

 (2)创建好一个栈,此时第一次入栈的是上面这组数组的首位位置

 (3)进入循环,取出栈里面的数组范围的元素,然后进行第一次快速排序之后

 (4)按照以上的流程走,每次进行一次快速排序之后就把返回i和j交汇位置的左右边首位位置依次入栈,直到栈为空就结束排序,此时排序完成。

 Python代码实现

非递归快速排序

import random as r

class Stack(object):
    '''创建栈'''
    def __init__(self):
        self.stack=[]
    def isempty(self):
        return self.stack==[]
    def push(self,data):
        self.stack.append(data)
    def pop(self):
        if not self.isempty():
            return self.stack.pop()

def PartSort(li,left,right):
    '''实现一轮的快速排序'''
    temp=li[left]
    i=left
    j=right
    while i!=j:
        while li[j]>=temp and i<j:
            j-=1
        while li[i]<=temp and i<j:
            i+=1
        if i<j:
            li[i],li[j]=li[j],li[i]
    li[left],li[i]=li[i],li[left]
    return i #返回此时交汇的位置

def quick_sort(left,right,li):
    '''利用栈非递归实现排序,多次调用快速排序流程'''
    stack=Stack()
    if left<right:#栈的初始化,把开始的头和尾指针放入栈
       stack.push(left)
       stack.push(right)
    else:
        return
    while not stack.isempty():#如果为非空栈
        j=stack.pop()#尾指针出栈
        i=stack.pop()#头指针出栈
        mid=PartSort(li,i,j) #进行快速排序,返回交汇处
        #作判断是否满足条件,然后添加指针入栈
        if i+1<mid:
            stack.push(i)
            stack.push(mid-1)
        if mid<j-1:
            stack.push(mid+1)
            stack.push(j)

if __name__ == '__main__':
    li=[r.randint(0,20) for _ in range(10)]
    print(li)
    quick_sort(0,len(li)-1,li)
    print(li)
#输出结果:
# [12, 8, 15, 4, 11, 16, 3, 17, 0, 20]
# [0, 3, 4, 8, 11, 12, 15, 16, 17, 20]

 好了,以上就是本期的全部内容了,我们下一期再见!

分享一张壁纸:

猜你喜欢

转载自blog.csdn.net/m0_73633088/article/details/130276726