#-*- 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实现)
最新推荐文章于 2023-09-17 18:10:04 发布