数据结构之快速排序(python实现)

#-*- coding : utf-8 -*-
'''
快速排序:
属于交换排序,通过元素之间的比较和交换位置来达到排序的目的
分治法:在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分
平均时间复杂度O(nlogn)
一般选择数列的第一个元素为基准元素,也可以随机选择一个元素作为基准元素
'''

'''
一、双边循环法
设置右指针和左指针,指向数列的最左和最右两个元素
第一次循环,从右指针开始,让指针所指向的元素和基准元素做比较。如果大于或等于基准元素,则指针向左移动;如果小于基准元素,则右指针停止移动,切换到左指针;
轮到左指针行动,让指针所指向的元素和基准元素做比较。如果小于或等于基准元素,则指针向右移动;如果大于基准元素,则左指针停止移动
'''
#使用递归
def quickSort(string,startIndex,endIndex):
    if(startIndex<endIndex):
        #基准元素位置
        pivotIndex=partition(string,startIndex,endIndex)
        #根据基准元素,分成两部分进行递归排序
        quickSort(string,startIndex,pivotIndex-1)
        quickSort(string,pivotIndex+1,endIndex)

def partition(string,startIndex,endIndex):
    pivot=string[startIndex]
    while startIndex!=endIndex:
        while startIndex<endIndex and string[endIndex]>pivot:
            endIndex-=1
        string[startIndex]=string[endIndex]
        while startIndex<endIndex and string[startIndex]<=pivot:
            startIndex+=1
        string[endIndex]=string[startIndex]
    string[startIndex]=pivot
    return startIndex
string=[4,7,6,5,3,2,8,1]
quickSort(string,0,len(string)-1)
#print(string)

'''
二、单边循环法
设置mark指针,指向小于基准元素的区域边界
如果遍历到的元素大于基准元素,就继续往后遍历;
如果遍历到的元素小于基准元素:第一,把mark指针右移一位,因为小于基准元素的区域边界增大了1;
                        第二,让最新遍历的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素属于小于基准元素的区域。
'''
def quickSort1(string,startIndex,endIndex):
    if (startIndex < endIndex):
        pivotIndex = partition1(string, startIndex, endIndex)
        # 根据基准元素,分成两部分进行递归排序
        quickSort1(string, startIndex, pivotIndex - 1)
        quickSort1(string, pivotIndex + 1, endIndex)

def partition1(string,startIndex,endIndex):
    pivot=string[startIndex]
    mark=startIndex
    for i in range(startIndex,endIndex+1):
        if(string[i]<pivot):
            mark += 1
            temp=string[i]
            string[i]=string[mark]
            string[mark]=temp

    string[startIndex]=string[mark]
    string[mark]=pivot
    return mark
string1=[4,7,6,5,3,2,8,1]
quickSort1(string1,0,len(string)-1)
#print(string1)

#非递归实现
def quickSort2(string):
    stack = []
    stack.append(len(string) - 1)
    stack.append(0)
    while stack:
        a = stack.pop()
        b = stack.pop()
        index = partition1(string, a, b)
        if a < index - 1:
            stack.append(index - 1)
            stack.append(a)
        if b > index + 1:
            stack.append(b)
            stack.append(index + 1)
string2=[4,7,6,5,3,2,8,1]
quickSort2(string1)
print(string1)

你可能感兴趣的:(数据结构,数据结构,快速排序,排序算法,python)