算法描述:
冒泡排序的一种改进,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小, 则分别这两部分记录继续进行排序,以达到整个序列有序。整个排序过程可以递归进行。
代码实现:
一趟快速排序的具体做法是:
- 设两个指针,初值分别指为ow和high,设置枢轴记录的关键字为piovtkey
- 用子表的第一个记录lst[low]做枢轴记录
- 先从high指向的位置起,向前搜索找到第一个关键字小于piovtkey的记录,和枢轴记录互相交换
- 再从low 指向的位置起,向后搜索找到第一个关键字小于piovtkey的记录,和枢轴记录互相交换
- 重复以上两步操作直至low=high为止
def quick_sort(lst):
Qsort(lst, 0, len(lst)-1)
def Qsort(lst, low, high):
if(low < high):
pivot = Partition(lst, low, high) #将lst一分为二,获得枢轴值pivot
Qsort(lst, low, pivot-1) #对低子表递归排序
Qsort(lst, pivot+1, high) #对高子表递归排序
def Partition(lst, low, high):
pivotkey = lst[low] #用子表的第一个记录做枢轴记录
while low < high: #从表的两端交替想中间扫描
while low<high and lst[high]>=pivotkey:
high -= 1
lst[low] = lst[high] #将比枢轴记录小的记录交换到低端
while low<high and lst[low]<=pivotkey:
low += 1
lst[high] = lst[low] #将比枢轴记录大的记录交换到高端
lst[low] = pivotkey #返回枢轴所在位置
return low
if __name__ == "__main__":
data = [50, 10, 90, 30, 70, 40, 80, 60, 20]
print(data)
quick_sort(data)
print(data)
算法性能:
时间复杂度:O(nlgn),快速排序被认为是,在所有同数量级(o(nlogn))的排序方法中,其平均性能最好。但是,如果初始记录关键字有序或者基本有序,快速排序将蜕化为冒泡排序,其时间复杂度为O(n**2)。
空间复杂度:O(n),因为快速排序需要一个栈空间来实现递归。