排序算法之python快速排序

快速排序

介绍:

    快速排序是由东尼·霍尔所在1962年提出的一种排序算法,是一种交换排序。

思想:

从待排序列中挑出一个元素,作为"基准"(pivot),通过一趟排序,把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。对前后两个区间重复此操作,直到前后前后分区的带下是0或1结束。每一次都确定待排序列中一个元素的位置。

代码:

def QuickSort(input_list,left,right):
	def Divsion(input_list,left,right):
		#pivot为基准
		pivot = input_list[left]
		while left<right:
			while left<right and input_list[right]>=pivot:
				right -= 1
			#找到一个元素小于基准元素,则把该元素放在前面
			input_list[left] = input_list[right]
			while left<right and input_list[left]<=pivot:
				left += 1
			#找到一个元素大于基准元素,则把该元素放到后面
			input_list[right] = input_list[left]
		#当left = right,即此时,left位置的左边都比基准元素小,
		#left元素右边都比基准元素大,此时把基准元素放入该位置,
		#即该位置就是基准元素的最终排序位置
		input_list[left] = pivot
		return left

	if left < right:
		pivot_index = Divsion(input_list,left,right)
		print("每执行本次分区后的结果:")
		print(input_list)
		#用分治法对待排元素的左右两边分别递归进行QuickSort
		QuickSort(input_list,left,pivot_index-1)
		QuickSort(input_list,pivot_index+1,right)
		
if __name__ == '__main__':
	input_list = [50,123,543,187,49,30,0,2,11,100]
	print("input_list:")
	print(input_list)
	QuickSort(input_list,0,len(input_list)-1)
	print("sorted_list:")
	print(input_list)
	

结果:

input_list:
[50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
每执行本次分区后的结果:
[11, 2, 0, 30, 49, 50, 187, 543, 123, 100]
每执行本次分区后的结果:
[0, 2, 11, 30, 49, 50, 187, 543, 123, 100]
每执行本次分区后的结果:
[0, 2, 11, 30, 49, 50, 187, 543, 123, 100]
每执行本次分区后的结果:
[0, 2, 11, 30, 49, 50, 187, 543, 123, 100]
每执行本次分区后的结果:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
每执行本次分区后的结果:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
sorted_list:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]

分析:

1.算法性能

2.时间复杂度

当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差,需要O(n^2)次比较。而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。在平均状况下,排序n个元素要O(nlogn)次比较。数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。另外,快速排序在每次分割的过程中,需要 1 个空间存储基准值。快速排序的大概需要 NlogN次的分割处理,所以占用空间也是 NlogN 个。

3.算法稳定性

是一种不稳定的排序算法,比如序列:{ 1, 3, 4, 2, 8, 9, 8, 7, 5 },基准元素是5,一次划分操作后5要和第一个8进行交换,从而改变了两个元素8的相对次序

猜你喜欢

转载自blog.csdn.net/lerry13579/article/details/82051223