数据结构 - 快速排序举例

之前学习的时候就一直很注意快速排序,但是看完总是忘记,这一次看到一个视频系列讲解十分透彻,可以分享给大家

https://www.bilibili.com/video/av17888877这是一个三集的讲解快速排序的,给予充足的思考时间,方便大家学习,再次感谢B站博主的分享.

快速排序使用分而治之来获得与归并排序相同的优点,而不使用额外的存储。然而,作为权衡,有可能列表不能被分成两半。当这种情况发生时,我们将看到性能降低。

快速排序首先选择一个值,该值称为 枢轴值。虽然有很多不同的方法来选择枢轴值,我们将使用列表中的第一项。枢轴值的作用是帮助拆分列表。枢轴值属于最终排序列表(通常称为拆分点)的实际位置,将用于将列表划分为快速排序的后续调用。

Figure 12 展示 54 将作为我们的第一个枢纽值。由于我们已经看过这个例子几次,我们知道 54 最终将会在当前持有 31 的位置。接下来将发生分区过程。它将找到拆分点,同时将其他项移动到列表的适当侧,小于或大于枢轴值。

5.12.快速排序.figure12

Figure 12

分区从通过在列表中剩余项目的开始和结束处定位两个位置标记(我们称为左标记和右标记)开始(Figure 13中的位置 1 和 8 )。分区的目标是移动相对于枢轴值位于错误侧的项,同时也收敛于分裂点。 Figure13展示了我们定位54的位置的过程。

5.12.快速排序.figure13

Figure 13

我们首先增加左标记,直到我们找到一个大于枢轴值的值。 然后我们递减右标,直到我们找到小于枢轴值的值。我们发现了两个相对于最终分裂点位置不适当的项。 对于我们的例子,这发生在 93 和 20。现在我们可以交换这两个项目,然后重复该过程。

在右标变得小于左标记的点,我们停止。右标记的位置现在是分割点。枢轴值可以与拆分点的内容交换,枢轴值现在就位(Figure 14)。 此外,分割点左侧的所有项都小于枢轴值,分割点右侧的所有项都大于枢轴值。现在可以在分割点处划分列表,并且可以在两半上递归调用快速排序。

5.12.快速排序.figure14

目前.看到的都是比较长的实现,我再次简单分析一下.

目标: 对一组数据进行排序

方法:快速排序

分析:一般来说选择列表的第一个元素进行作为midvalue,该变量将作为一个隔板,将原有列表中的数据分成
两个部分,一个部分为小于midvalue的,另外一个部分显然就是大于midvalue的.将列表中的数据分成两部
分后,那么此时midvalue的位置实际上就是最后排序完成后midvalue的位置.之后再对原有列表小于
midvalue和大于midvalue部分充分上述分割操作,即递归.

注意:
1. 递归的条件,因为我们对列表分割的最终是将其分为一个一个的,之后也就不能再进行切分了,因此这作为递归的条件之一
2. 注意源码中出现first和last,是因为我们所有的操作都是针对原来列表的,每一次切分都会造成列表的缩短,索引会出现问题.

源码呈上:

def quicksort(nums, first, last):
   # 递归判断条件
   if first >= last:
      return

   # 获取midvalue值,将原列表数据进行切分
   midvalue = nums[first]
   left = first
   right = last
   while left < right:
      while left <= right and nums[right] >= midvalue:
         right -= 1
      nums[left] = nums[right]
      while left <= right and nums[left] < midvalue:
         left += 1
      nums[right] = nums[left]
   nums[left] = midvalue

   # 递归
   quicksort(nums, first, left -1)
   quicksort(nums, left+1, last)

nums= [1,54,575,5675,75]
quicksort(nums, 0, len(nums)-1)
print nums

结果:
/usr/bin/python2.7 "/home/trami/Data Structure/study.py"
[1, 54, 75, 575, 5675]

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/jhlovetll/article/details/84678304