【排序算法】4.快速排序

–快速排序运用了分而治之的方法,将需要解决的大问题逐步分解成小问题,直到达到一个基线。
快速排序的思路:
1.选择一个基线作为中值,将所有比这个基线小的值放在一个数组里,比基线大的值放在另一个数组里,即[小于基线]+基线+[大于基线]
2.随后再将基线两边的数组进行递归,直到基线左右的数都小于1个时即停止递归。
Python代码如下:

def quick_sort(nums):
	if len(nums) < 2:
		return nums
	mid = nums[0]
	
	lower = [i for i in nums[1:] if i <= mid]
	higher = [i for i in nums[1:] if i > mid]
	return quick_sort(lower) + [mid] + quick_sort(higher)
nums = [34,21,3,4,67,1,2,2,1]
print(quick_sort(nums))

上面的代码参考自《算法图解》一书,该方法的平均时间复杂度为O(nlogn),其中n为每次递归所需要的操作次数,logn为递归的次数,即栈的深度。该方法的空间复杂度同样为O(nlogn)使用了较多的额外数组空间。
下面的代码参考自北京图灵学院的讲义,使用了原地交换的方法,使用了较少的额外空间。

def quick_sort2(nums, start,end):
	'''
	nums: list
	start: 初始位置
	end: 结束位置
	'''
	# 结束条件
	if start >= end:
		return
	# 基准值
	basic = nums[start]
	# 两个游标
	low = start
	high = end

	while low < high:
		 #从后开始往前找,找到比基准值小的数时,将其放在前面的空位上
		 #(由于基准值已保存,因此空出空位,当这个数放到其他位置上时,该位置也产生一个空位)
		 while low < high and nums[high] >= basic:
			 high -= 1
		 nums[low] = nums[high]
		 #从前往后找,找到比基准值大的数时,放到后面的空位去
		 while low < high and nums[low] <= basic:
			 low += 1
		 nums[high] = nums[low]
		 #将基准值放回中间的空位上,由于此时low与high重合,因此使用任意指针皆可
		 nums[low] = basic
		 #分别递归
		 quick_sort2(nums,start ,low-1)
		 quick_sort2(nums, high+1, end)
 nums = [34,4,214,5,32,2,1]
 quick_sort2(nums,0,len(nums)-1)
 print(nums)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值