zoukankan      html  css  js  c++  java
  • 排序算法之快速排序

    1.快速排序定义:

      快排的主要思想:分治+迭代,只需要三步:

    1. 在数列之中,选择一个元素作为”基准”(pivot),或者叫比较值。
    2. 数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边
    3. 以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    2.复杂度:  

            最优时间复杂度:O(nlogn)

       最差时间复杂度:O(n^2)

       最优空间复杂度为:O(logn)  ;每一次都平分数组的情况
     
            最差空间复杂度为:O( n )      ;退化为冒泡排序的情况

    3.稳定性:

      不稳定(比如基准值的前后都存在与基准值相同的元素,那么相同值就会被放在一边,这样就打乱了之前的相对顺序)

         例如:【5(1),,8,5(2),2,9】通过快速排序变为【2,5(1),5(2),8,9】or【2,5(2),5(1),8,9】

    4.与归并排序的区别:

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

    5.面试

    • 面试官:你了解快排吗?
    • 你:略知一二
    • 面试官:那你讲讲快排的算法思想吧
    • 你:快排基本思想是:从数据集中选取一个基准,然后让数据集的每个元素和基准值比较,小于基准值的元素放入左边分区大于基准值的元素放入右边分区,最后以左右两边分区为新的数据集进行递归分区,直到只剩一个元素。
    • 面试官:快排有什么优点,有什么缺点?
    • 你:分治思想的排序在处理大数据集量时效果比较好,小数据集性能差些。
    • 面试官:那该如何优化?
    • 你:对大规模数据集进行快排,当分区的规模达到一定小时改用插入排序,插入排序在小数据规模时排序性能较好。
    • 面试官:那你能手写一个快排吗?
    • 你:quick_sort = lambda array: array if len(array) <=> array[0]])

    6.Python代码:

     1 #coding:utf-8
     2 
     3 def parttion(v, left, right):
     4     '''
     5     :param v: 要排序的列表
     6     :param left: 列表起始端
     7     :param right: 列表末端
     8     :return:
     9     '''
    10     key = v[left]  #基准
    11     low = left
    12     high = right
    13     while low < high:
    14         while (low < high) and (v[high] >= key):
    15             high -= 1
    16         v[low], v[high] = v[high],v[low]
    17         while (low < high) and (v[low] <= key):
    18             low += 1
    19         v[high],v[low] = v[low],v[high]
    20         v[low] = key
    21     return low
    22 def quicksort(v, left, right):
    23     if left < right:
    24         p = parttion(v, left, right)
    25         quicksort(v, left, p-1)
    26         quicksort(v, p+1, right)
    27     return v
    28 
    29 s = [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
    30 print("before sort:",s)
    31 s1 = quicksort(s, left = 0, right = len(s) - 1)
    32 print("after sort:",s1)

    输出结果:

  • 相关阅读:
    扫移动护理系统mysql数据库视图的Database通讯点报错Caused by: java.sql.SQLException: Value '00000000 00:00:00' can not be represented as java.sql.Timestamp
    ORACLE sql insert case when
    解决超过4000字符的字符串insert的时候报错ORA01461: 仅能绑定要插入LONG列的LONG值
    将92服务器上面的加解密服务run.bat形式改为后台服务形式
    Oracle调整sga_max_size内存参后报ORA00844和ORA00851 SGA_MAX_SIZE 42949672960 cannot be set to more than MEMORY_TARGET 6979321856. 导致数据库连接不上去,提示ORA01034:ORACLE notavailable
    解决MATLAB一直初始化,加速MATLAB(转载)
    WIN7下隐藏或显示Lenovo_Recovery_Q盘(转载)
    flowable流程中心设计(一)
    mysqlgroup by原理
    SpringMVC系列导航
  • 原文地址:https://www.cnblogs.com/xiaodangdang/p/13207598.html
Copyright © 2011-2022 走看看