zoukankan      html  css  js  c++  java
  • Python排序算法(一)——快速排序

    有趣的事,Python永远不会缺席!

    如需转发,请注明出处:小婷儿的python  https://www.cnblogs.com/xxtalhr/p/10768593.html 

      排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。其中”快速排序”(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的。

    一、快速排序(Quicksort)

      快速排序(quick sort)的采用了分治的策略。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    1、原理

    1. 在数列之中,选择一个元素作为”基准”(pivot),或者叫比较值。

    2. 数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边

    3. 以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    举个例子,假设我现在有一个数列需要使用快排来排序:[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],我们来看看使用快排的详细步骤:

    1. 选取中间的66作为基准值(基准值可以随便选)

    2. 数列从第一个元素11开始和基准值66进行比较,小于基准值,那么将它放入左边的分区中,第二个元素99比基准值66大,把它放入右边的分区中。

    3. 然后依次对左右两个分区进行再分区,直到最后只有一个元素

    4. 分解完成再一层一层返回,返回规则是:左边分区+基准值+右边分区

     2、代码

    代码用jupyternotebook实现

     1 def quick_sort(b):
     2     """快速排序"""
     3     if len(b) < 2:
     4         return arr
     5     # 选取基准,随便选哪个都可以,选中间的便于理解
     6     mid = arr[len(b) // 2]
     7     # 定义基准值左右两个数列
     8     left, right = [], []
     9     # 从原始数组中移除基准值
    10     b.remove(mid)
    11     for item in b:
    12         # 大于基准值放右边
    13         if item >= mid:
    14             right.append(item)
    15         else:
    16             # 小于基准值放左边
    17             left.append(item)
    18     # 使用迭代进行比较
    19     return quick_sort(left) + [mid] + quick_sort(right)

    b = [11, 99, 33, 69, 77, 88, 55, 11, 33, 36, 39, 66, 44, 22]
    quick_sort(b)
    
    #返回:[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]
    

      高逼格(一行代码表示):

    1 quick_sort = lambda array: array if len(array) <= 1 else quick_sort([
    2     item for item in array[1:] if item <= array[0]
    3 ]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])
    4 
    5 quick_sort([2,5,9,3,7,1,5])
    6 #返回[1, 2, 3, 5, 5, 7, 9]

    3、特点

    1. 稳定性:快排是一种不稳定排序,比如基准值的前后都存在与基准值相同的元素,那么相同值就会被放在一边,这样就打乱了之前的相对顺序

    2. 比较性:因为排序时元素之间需要比较,所以是比较排序

    3. 时间复杂度:快排的时间复杂度为O(nlogn)

    4. 空间复杂度:排序时需要另外申请空间,并且随着数列规模增大而增大,其复杂度为:O(nlogn)

    5. 归并排序与快排 :归并排序与快排两种排序思想都是分而治之,但是它们分解和合并的策略不一样:归并是从中间直接将数列分成两个,而快排是比较后将小的放左边大的放右边,所以在合并的时候归并排序还是需要将两个数列重新再次排序,而快排则是直接合并不再需要排序,所以快排比归并排序更高效一些,可以从示意图中比较二者之间的区别。

    6. 快速排序有一个缺点就是对于小规模的数据集性能不是很好

    结果   

      Successfully !!!

      有趣的事,Python永远不会缺席!还不来加我,瞅什么瞅。

  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/pythonbao/p/10768593.html
Copyright © 2011-2022 走看看