数据结构与算法学习笔记九 --- 快速排序算法

梦想与她 提交于 2020-02-28 18:51:27

快速排序算法(Quick Sort)

快速排序算法是一种递归排序算法;

  • 原理是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  • 简单点理解就是:以序列中的任意一个元素为基准(一般以第一个元素),通过逐个比较后,找到这个基准元素的合适位置(即在基准元素的左边元素都比它小,右边都比它大),这时在将序列分成左右两个部分,在继续上述的操作,直到不能再分为止(只有一个元素),此时排序也就完成。

快速排序过程图
在这里插入图片描述

快速排序算法的python实现

快速排序算法的代码实现最主要的是找到基准元素的位置,然后分成两部分,再用递归的方法,重复实现一样的操作。
代码如下:

def quick_sort(alist, first, last):
    """快速排序"""
	# 参数first,last:指定序列排序的位置起始和终止下标

    # 只有当first小于last时才退出排序,此时元素只有一个。
    if first >= last:
        return alist
    else:
        mid_value = alist[first]
        low = first
        high = last
        while low < high:
            # high 左移
            while low < high and alist[high] >= mid_value:
                    high -= 1
            alist[low] = alist[high]
            # 此时alist[low]的值已经小于或等于mid_value
            # low 右移
            while low < high and alist[low] < mid_value:
                low += 1
            alist[high] = alist[low]
        # 从循环退出时,low等于high
        alist[low] = mid_value

        # 对low左边的列表进行快速排序
        quick_sort(alist, first, low-1)
        # 对low右边的列表进行快速排序
        quick_sort(alist, low+1, last)

或者:

def quick_sort2(alist):
    if len(alist) <= 1:
        return alist
    
    left = list()
    right = list()
    # 以序列中的第一个元素作为基准元素,将序列以基准元素分成两部分
    for elem in alist[1:]:
        if elem <= alist[0]:
            left.append(elem)
        else:
            right.append(elem)
    # 合并时,需要都是list类型,所以需将基准元素变成list类型
    return quick_sort2(left) + [alist[0]] + quick_sort2(right)

快速排序算法的时间复杂度与稳定性

  • 最优时间复杂度:O(nlogn) ---- >每次分组都对半分
  • 最坏时间复杂度:O(n2) ----> 每次分组只能分为基准元素和比基准元素大(或小)的部分,也就是每次分组只有一组进行递归。
  • 稳定性:不稳定
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!