【数据结构与算法python】快速排序算法的python实现

1、概念解释

(1)思路

快速排序的思路是依据一个“中值”数据项来把数据表分为两半:小于中值的一半和大于中值的一半, 然后每部分分别进行快速排序(递归)如果希望这两半拥有相等数量的数据项,则应该找到数据表的“中位数”但找中位数需要计算开销!要想没有开销,只能随意找一个数来充当“中值”比如,第1个数。

(2)递归三要素

快速排序的递归算法“递归三要素”如下

  • 基本结束条件:数据表仅有1个数据项,自然是排好序的
  • 缩小规模:根据“中值”, 将数据表分为两半, 最好情况是相等规模的两半
  • 调用自身:将两半分别调用自身进行排序(排序基本操作在分裂过程中)

(3)实现步骤

❖分裂数据表的目标:找到“中值”的位置
❖分裂数据表的手段
设置左右标(left/rightmark)
左标向右移动,右标向左移动
• 左标一直向右移动,碰到比中值大的就停止
• 右标一直向左移动,碰到比中值小的就停止
• 然后把左右标所指的数据项交换
继续移动,直到左标移到右标的右侧,停止移动
这时右标所指位置就是“中值”应处的位置
将中值和这个位置交换
分裂完成,左半部比中值小,右半部比中值大

2、代码实现

def quickSort(alist):
   quickSortHelper(alist,0,len(alist)-1)

def quickSortHelper(alist,first,last):
   if first<last:

       splitpoint = partition(alist,first,last)

       quickSortHelper(alist,first,splitpoint-1)
       quickSortHelper(alist,splitpoint+1,last)


def partition(alist,first,last):
   pivotvalue = alist[first]

   leftmark = first+1
   rightmark = last

   done = False
   while not done:

       while leftmark <= rightmark and \
               alist[leftmark] <= pivotvalue:
           leftmark = leftmark + 1

       while alist[rightmark] >= pivotvalue and \
               rightmark >= leftmark:
           rightmark = rightmark -1

       if rightmark < leftmark:
           done = True
       else:
           temp = alist[leftmark]
           alist[leftmark] = alist[rightmark]
           alist[rightmark] = temp

   temp = alist[first]
   alist[first] = alist[rightmark]
   alist[rightmark] = temp


   return rightmark
   
alist = [54,26,93,17,77,31,44,55,20]
quickSort(alist)
print(alist)

3、算法分析

(1)时间复杂度

快速排序过程分为两部分: 分裂和移动如果分裂总能把数据表分为相等的两部分,那么就是O(log n)的复杂度;而移动需要将每项都与中值进行比对,还是O(n),综合起来就是O(nlog n);

(2)优点

算法运行过程中不需要额外的存储空间。

(3)缺点

如果不那么幸运的话, 中值所在的分裂点过于偏离中部, 造成左右两部分数量不平衡。极端情况下, 有一部分始终没有数据, 这样,时间复杂度就退化到O(n2),还要加上递归调用的开销(比冒泡排序还糟糕)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值