python 排序(一)快速排序、原理以及代码实现、比较归并排序、时间复杂度推算

一、介绍

快速排序(quick sort)采用了分治的策略(很多排序都应用到分治,比如归并排序)。

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

1、原理以及思想:

(1)、将数据分为两步分,先在原数组选取一个数据做为基准值

(2)、将数据中其余所有元素与基准值比较,比基准值小的放在左边,比基准值大的放在右边

(3)、基准值两边的子列做为新数剧,不断的重复第一步跟第二步,直到所有子集只剩下一个元素为止

2、举例说明:

数组:[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36, 39, 66, 44, 22]

1、选取基准值66

2、将数组中除去66以外的所有值与66比较

      11小于66,放在66的左分区,然后99大于66,放在66的右分区

      第一轮结束:左分区:[11,33,55,11,  33,  36,  39,  44,  22],右分区:[99,69,77,  88] 基准:66

3、将左右分区的数据分别进行第一二部的操作,直到分区数据数量为一

二、代码实现

def quick_sort(lis):
    """
    quick sort

    return: sort list, mid, right list
    """
    if len(lis) < 2: #数组大小小于2就返回
        return lis

    mid = lis[len(lis) // 2] #取基准值
    left_list, right_list = [], [] 
    lis.remove(mid) #除去基准值
    for i in lis:
        if i >= mid:
            right_list.append(i)
        else:
            left_list.append(i)
    #print     right_list,     left_list
    return quick_sort(left_list) + [mid] + quick_sort(right_list) #递归实现快排

if __name__ == '__main__':
    lis = [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36, 39, 66, 44, 22]
    print quick_sort(lis)

#[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

三、总结

1、排序的稳定性:快速排序是一种时间复杂度不稳定的算法,跟数据的顺序有关

2、复杂度:时间复杂度O(nlogn),空间复杂度O(nlogn)

3、比较归并排序:

(1)快速排序和归并的区别就在于它正好和递归的排序反过来。快速排序先排序再递归细分,排序是从上到下的。归并排序先递归细分再排序,排序是从下到上的。

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

四、时间复杂度推算

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值