【python & 快速排序算法】

【python & 快速排序算法】

算法基本原理思想

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

在这里插入图片描述

  • 快速排序的递归算法“递归三要素”如下:
  • 基本结束条件:数据表仅有1个数据项,自然是排好序的
  • 缩小规模:根据“中值”,将数据表分为两半,最好情况是相等规模的两半
  • 调用自身:将两半分别调用自身进行排序(排序基本操作在分裂过程中)
    》》》》》》》》》》》
  • 示意图:

在这里插入图片描述

在这里插入图片描述

  • 最终的:中值分割为: 31 26 20 17 44 54 77 55 93
  • 再调用递归,把左半部分 31 26 20 17 44 和 右半部分 77 55 93 分别排序

排序代码示例

在这里插入图片描述
在这里插入图片描述

复杂度分析

  • 快速排序过程分为两部分分裂和移动
  • 如果分裂总能把数据表分为相等的两部分,那么就是0(1ogn)的复杂度若移动需要将每项都与中值进行比对,还是0(n)
  • 综合起来就是O(nlog n);而且,算法运行过程中不需要额外的存储空间。
  • 但是,如果不那么幸运的话,中值所在的分裂点过于偏离中部,造成左右两部分数量不平衡,极端情况,有一部分始终没有数据,这样时间复杂度就退化到O(n2)
  • 还要加上递归调用的开销(比冒泡排序还糟糕)可以适当改进下中值的选取方法,让中值更具有代表性,比如**“三点取样”**,从数据表的头、尾、中间选出中值,但是会产生额外计算开销,仍然不能排除极端情况

Guess you like

Origin blog.csdn.net/Kefenggewu_/article/details/120902020