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

    快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    比如序列[6,8,1,4,3,9],选取6为基准数key(不会变的),然后从右往左遍历过去,发现第一个比key小的数3,就把6和3交换位置,序列就变成了[3,8,1,4,6,9]

    然后从左往右遍历过去,发现第一个比key大的值8,把8和6交换位置,序列变成[3,6,1,4,8,9]

    以上称为一次小循环

    然后再来一次循环,序列变成了[3,4,1,6,8,9],发现6的左边都是比6小的数,右边都是比6大的数,此时无法再遍历了,于是退出这个大循环

    接下去,需要对key值左边的序列和右边的序列分别重复以上操作,也就是[3,4,1]和[8,9],只要用递归就行了。

    代码如下:

     1 def quick_sort(array,left,right):
     2     if left >= right:
     3         return
     4 
     5     low = left#序列第一个索引
     6     high= right#序列最后一个索引
     7     key = array[low]#基准书数
     8 
     9     while low < high:#在左右未相遇的情况下
    10         while low < high and array[high] > key:#找到右侧比key小的那个值
    11             high -= 1
    12         array[low] = array[high]
    13         array[high] = key
    14 
    15         while low < high and array[low] <= key:#找到左侧比key大的值
    16             low += 1 
    17         array[high] = array[low]
    18         array[low] = key
    19 
    20     quick_sort(array,left,low-1)#对key左边的序列进行递归
    21     quick_sort(array,low+1,right)#对key右边的序列进行递归
    22 array = [8,4,2,3,5,34,1,40] quick_sort(array,0,len(array)-1) print(array) # [1, 2, 3, 4, 5, 8, 34, 40]

    需要注意的地方是,10和15行需要加上等于号,可以两个或者任意一个,不然遇上序列中有多个相同的值会进入死循环

    直接插入排序复杂度: 

    时间复杂度: 最好情况O(nlogn), 最坏情况O(n^2), 平均情况O(nlogn)

    下面空间复杂度是看别人博客的,我也不大懂了……改天再研究下。

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

    稳定性:不稳定

    人生苦短,何不用python
  • 相关阅读:
    [恢]hdu 2502
    [恢]hdu 1008
    [恢]hdu 2073
    [恢]hdu 2500
    [恢]hdu 2501
    [恢]hdu 2190
    [恢]hdu 2535
    [恢]hdu 2085
    [恢]hdu 2067
    [恢]hdu 2504
  • 原文地址:https://www.cnblogs.com/yqpy/p/8650488.html
Copyright © 2011-2022 走看看