python实现快速排序

import time
#quick sort: give a value to make data before it is less than。给定指针i,j,j从[start,end), str[j]<key,与str[i]交换,保证i及i前的值都<key,i+1后的>=key。重设i+1
def partition(str,start_index,end_index):
    key=str[end_index]
    i=start_index-1
    for j in range(start_index,end_index): #
        if str[j]<key:
            i+=1
            tmp=str[j]
            str[j]=str[i]
            str[i]=tmp
    str[end_index]=str[i+1]
    str[i+1]=key
    return i+1


def quickSort(str,start_index,end_index):
    if start_index<end_index:
        k=partition(str,start_index,end_index)
        quickSort(str,start_index,k-1)
        quickSort(str,k+1,end_index)


#快速排序,i=0,j=N-1,第一个数组元素为关键数据,从j开始向前搜索(j--),找到第一个小于key的元素,str[i]=str[j];从i开始向后搜索(i++),找到第一个大于key的元素,str[j]=str[i]
def partition2(str,start_index,end_index):
    i=start_index
    j=end_index
    while i<j:
        while i<j and str[i]<=str[j]:  #str[0]设定为关键元素,从右向左找key
            j-=1
        if i<j:
            temp=str[i]
            str[i]=str[j]
            str[j]=temp
            
        while i<j and str[i]<=str[j]:  #此时key为str[j],从左向右找
            i=i+1
        if i<j:
            temp=str[i]
            str[i]=str[j]
            str[j]=temp
    return i
        
def quickSort2(str,start_index,end_index):
    if start_index<end_index:
        k=partition2(str,start_index,end_index)
        quickSort2(str,start_index,k-1)
        quickSort2(str,k+1,end_index)
        
#给定指针i,j,j从[end,start), str[j]>=key,与str[i]交换,保证i及i后的值都>=key,i-1前的<key。重设i-1
def partition1(str,start_index,end_index):
    key=str[start_index]
    i=end_index+1
    for j in range(end_index,start_index,-1):  
        if str[j]>=key:
            i-=1
            tmp=str[j]
            str[j]=str[i]
            str[i]=tmp
    #tmp=str[start_index]
    str[start_index]=str[i-1]
    str[i-1]=key
    return i-1


def quickSort1(str,start_index,end_index):
    if start_index<end_index:
        k=partition1(str,start_index,end_index)
        quickSort1(str,start_index,k-1)
        quickSort1(str,k+1,end_index)


str=[49,27,38,1,13,76,97,65]
beginTime=time.clock()
quickSort(str,0,len(str)-1)
endTime=time.clock()
print("快速排序")
print(str)
print(endTime-beginTime)


str=[49,27,38,1,13,76,97,65]
beginTime=time.clock()
quickSort1(str,0,len(str)-1)
endTime=time.clock()
print("快速排序1")
print(str)
print(endTime-beginTime)


str=[49,27,49,3,38,1,13,76,97,65]
beginTime=time.clock()
quickSort2(str,0,len(str)-1)
endTime=time.clock()
print("快速排序2")
print(str)
print(endTime-beginTime)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值