2017/9/6学习内容____用Python实现分治排序算法
quicksork 分治排序
# 需求
# quick sort 快速排序
# 分治排序算法
# 该算法首先去一个划分元素(partition element 也称为pivot)
# 然后重排列表,将其划为3分,left(<pivot),pivot,right(>pivot)
# 此时pivot已经在列表的最终位置上
# 最后分别对left和right两部分进行递归排序
其中:划分元素的选取直接影响快速排序算法的效率,通常选择列表的第一个元素、中间元素或最后一个元素作为划分元素
划分过程根据划分元素重新排列表,是快速排序算法的关键所在
优点:原位排序(只使用很小的辅助栈)
缺点:不稳定
# -*- coding:utf-8 -*- # Author : Iriving # 需求 # quick sort 快速排序 # 分治排序算法 # 该算法首先去一个划分元素(partition element 也称为pivot) # 然后重排列表,将其划为3分,left(<pivot),pivot,right(>pivot) # 此时pivot已经在列表的最终位置上 # 最后分别对left和right两部分进行递归排序 def partition(List,first,last): # 选取列表中第一个元素作为划分元素 pivot = List[first] leftmark = first+1 rightmark = last while True: while List[leftmark]<=pivot: # 若列表中存在小于等于pivot的值,放在left部分 # 以下代码用来检测pivot是列表的最大元素 # 防止leftmark越界 if leftmark == rightmark: break leftmark+=1 while List[rightmark]>pivot: # 大于pivot 放在right部分 # rightmark自动停留在first处 rightmark-=1 if leftmark < rightmark: # 此时leftmark的元素大于pivot # rightmark的元素<pivot # 交换两者 List[leftmark],List[rightmark] = List[rightmark],List[leftmark] else: break # 交换first处的划分元素与rightmark处的元素 List[first],List[rightmark] = List[rightmark],List[first] # 返回元素pivot的最终位置 return rightmark def qsort(L,first,last): if first < last: split = partition(L,first,last) qsort(L,first,split-1) qsort(L,split+1,last) def quicksort(L): qsort(L,0,len(L)-1) num_list = [5,-4,6,3,7,11,1,2] print('排序之前'+str(num_list)) quicksort(num_list) print('排序之后'+str(num_list))
执行结果:
排序之前[5, -4, 6, 3, 7, 11, 1, 2]
排序之后[-4, 1, 2, 3, 5, 6, 7, 11]

浙公网安备 33010602011771号