快速排序总结,Python版

快速排序是面试最常考内容,

让你描述算法,

让你写算法,

让你分析时间复杂度

1

#快速排序整理

'''

九章算法令狐冲老师排序思路:
先取到中心index对应的数组值
循环从左边找到第一个比中间值大的数字
循环从右边找到第一个比中间值小的数字
然后交换这两个数字
最后分别对左右两个部分重复以上思路


'''

def quickSort(arr):
	if not arr:
		return 
	return qsort(arr, 0, len(arr)- 1)

def qsort(arr, start, end):
	if start >= end:
		return 
	left, right = start, end  #start和end固定,以后只需要不停改变left和right的值就行了
	#注意1:拿到中间指针对应的数组值,而不是拿到中间指针的值
	pivot = arr[(left + right)//2]  
	#注意2: left <= right 而不是 left < right
	while left <= right:
		#注意3:arr[left] < pivot 而不是
		while left <= right and arr[left] < pivot:
			left += 1
		while left <= right and arr[right] > pivot:
			right -= 1

		arr[left], arr[right] = arr[right], arr[left] #交换left和right对应的值
		left += 1
		right -= 1
	print('left and right is :',left, right)
	#注意4:经过上面的交换,这里关系变为了right < left
	qsort(arr, start, right)
	qsort(arr, left, end)
	
	return arr


 
a = [9,3,8,5]
b = quickSort(a)
print("sequence is:", b)


输出
left and right is : 1 0
left and right is : 3 1
sequence is: [3, 5, 8, 9]
[Finished in 0.0s]



'''
复杂度分析:
当第一刀刚好切在左边,刚好导致左边只有一个数字,其他数字全部在右边,这种情况复杂度最差达到n的平方
当第一刀切在中间,并且左右两侧均匀分布,这种情况最优,复杂度达到nlogn

'''

这道题有四个注意点,要不然很容易出错。

下面是其他人的思路,总体一样

 

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

扫描二维码关注公众号,回复: 4126080 查看本文章

1 从数列中挑出一个元素,称为 "基准"(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

下面也是别人整理的,可以参考

1)n大时好,快速排序比较占用内存,内存随n的增大而增大,但却是效率高不稳定的排序算法。

(2)划分之后一边是一个,一边是n-1个,这种极端情况的时间复杂度就是O(n2)

(3)最好的情况是每次都能均匀的划分序列,O(nlog2n)

(4)快速排序空间复杂度只是在通常情况下才为O(log2n),如果是最坏情况的话,很显然就要O(n)的空间了。当然,可以通过随机化选择pivot来将空间复杂度降低到O(log2n)。

下面还是别人的

下面的算法就是把第一刀切在了最左边的位置

 

'''
六、快速排序 QuickSort
介绍:
快速排序通常明显比同为Ο(n log n)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可见掌握快排的重要性。
步骤:
1.从数列中挑出一个元素作为基准数。
2.分区过程,将比基准数大的放到右边,小于或等于它的数都放到左边。
3.再对左右区间递归执行第二步,直至各区间只有一个数。
'''
 
def quick_sort(ary):
    return qsort(ary,0,len(ary)-1)
 
def qsort(ary,left,right):
    #快排函数,ary为待排序数组,left为待排序的左边界,right为右边界
    if left >= right : return ary
    key = ary[left]     #取最左边的为基准数
    lp = left           #左指针
    rp = right          #右指针
    while lp < rp :
        while ary[rp] >= key and lp < rp :
            rp -= 1
        while ary[lp] <= key and lp < rp :
            lp += 1
        ary[lp],ary[rp] = ary[rp],ary[lp]
    ary[left],ary[lp] = ary[lp],ary[left]
    qsort(ary,left,lp-1)
    qsort(ary,rp+1,right)
    return ary
 
a = [9,3,8,5]
b = quick_sort(a)
print("sequence is:", b)

--------------------- 
作者:湾区Python 
来源:CSDN 
原文:https://blog.csdn.net/BTUJACK/article/details/80548249 
版权声明:本文为博主原创文章,转载请附上博文链接!

认识你是我们的缘分,同学,等等,学习人工智能,记得关注我。

微信扫一扫
关注该公众号

《湾区人工智能》

猜你喜欢

转载自blog.csdn.net/BTUJACK/article/details/84195993