快速排序的基本思想以及python实现

本文主要讲解快速排序的主要思想以及时间复杂度和空间复杂度,以及代码的实现(python版本)。
   快 速 排 序 \mathbf{快速排序}
  基本思想:通过一趟快速排序,将待排序的元素分割成独立的两部分,其中一部分的元素均比基准小,另一部分的元素均比基准大,然后分别对这两部分进行排序。直到最终序列有序。
  例题:假设给定的数组为[2,1,7,9,5,8],,对其进行快速排序。(还是假定从左到右,从小到大,即升序排序)。
  基本流程:
  1)设置两个指针,一个指向头部,一个指向尾部,假设基准选择指向头部的元素,即元素2。则我们比较基准与尾部的元素,元素2比元素8小,则尾部指针向前移一位。
  2)继续将尾部元素与基准进行比较,元素2比元素5小,则尾部指针向前移一位。
  3)继续将尾部元素与基准进行比较,元素2比元素9小,则尾部指针向前移一位。
  4)继续将尾部元素与基准进行比较,元素2比元素7小,则尾部指针向前移一位。
  5)继续将尾部元素与基准进行比较,元素2比元素1大,则将头部指针向后移一位,且将两个元素互换位置。
  此时头部指针和尾部指针,重叠,此次快排结束,继续将左边部分和右边部分分别进行快排,直到元素有序。
  代码实现:

class sort(object):
	# 定义nums为要排序的数组,low为左半边指针,high为右半边指针
	def quick_sort(self,nums,low,high):
		# 如果low >= high,则证明数组已有序,返回即可
		if low >= high:
			return
		# 将基准选为左边指针元素,low赋值给left,high赋值给right
		# left、right分别代表左边指针和右边指针
		cur,left,right = nums[low],low,high
		# 当左边指针小于右边指针时,我们执行快排
		while left < right:
			# 当左边指针小于右边指针,且右边指针元素大于基准时,
			# 右边指针向前移一位
			while left < right and cur <= nums[right]:
				right -= 1
			# 将右边指针元素赋值给左边指针所指位置
			nums[left] = nums[right]
			# 当左边指针小于右边指针,且左边指针元素小于基准时,
			# 左边指针向后移一位
			while left < right and cur > nums[left]:
				left += 1
			# 将左边指针元素赋值给右边指针所指位置
			nums[right] = nums[left]
		# 当一轮快排结束后,将基准赋值给左边指针所指位置
		nums[left] = cur
		# 分别将左右两部分进行快排
		quick_sort(nums,low,left-1)
		quick_sort(nums,left+1,high)
		return nums

算法分析:
  时间复杂度:
  1)当元素全部有序时,我们只进行n(n-1)/2次元素比较,所以时间复杂度为O(n^2)
  2)当元素全部逆序时,我们只进行n(n-1)/2次元素比较,所以时间复杂度为O(n^2)
  3)当元素杂乱无章时,其平均时间复杂度为O(nlogn)。
  由此可见,快速排序的时间复杂度为O(nlogn),且数组越有序,效率越低,越无序,效率越高。它是一种不稳定的算法。
  
  空间复杂度:
  每次划分都需要3个变量存储中间量,所以其空间复杂度为O(logn)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值