zoukankan      html  css  js  c++  java
  • 算法导论第七章快速排序

    快速排序的描述

    简介

    对于一个包含n个输入数的数组来说,快速排序是一种最坏情况下复杂度高达\(Θ(n^2)\)的排序算法,虽然最坏情况下复杂度很高,但平均性能很好,而且是通常情况下最优的排序算法,期望复杂度为\(Θ(nlgn)\),且常数很小,而且算法可以进行原址排序,甚至在虚存中也表现良好.

    描述

    快速排序运用了分治思想,主要使用了以下三步主要内容.

    1. 分解

    数组\(A[p..r]\)被划分为两个(可能为空)子数组\(A[p..q-1]\)\(A[q+1..r]\),使得
    \(A[p..q—1]\)中的每一个元素都小于等于\(A[q]\),而\(A[q]\)也小于等于\(A[q+1..r]\)中的每个元素。

    2.解决

    通过递归调用快速排序,对\(A[p..q-1]\)\(A[q+1..r]\)进行快速排序

    3.合并

    因为子数组都是原址操作,所以不需要合并,分解后自然有序

    数组的划分

    python描述

    def partition(A,p,r):#为数组A[p..r]
        x = A[r]#选末尾为pivot
        i = p-1
        for j in range(p,r):
            if A[j]<=x:
                i+=1#将i的区域向后延申,并于j交换
                A[i],A[j] = A[j],A[i]
        A[i+1],A[r] = A[r],A[i+1]
    

    划分实例

    证明

    即数组永远满足以下三个条件

    1. A[p...i]中的数据≤X
    2. A[i+1..j-1]中的数据>X
    3. A[r]=x

    当变量初始化时

    \(j = p,i = p-1,x=a[r]\)
    \(p>i\),条件1满足
    \(i+1>j-1\),条件2满足
    显然,条件3满足

    算法运行过程中

    已有\(A[i+1..j-1]>X\),当\(A[j]>X\)时,j++,因此继续满足\(A[i+1..j-1]>X\)
    \(A[j]<=X\)时,i++交换\(A[i]\)\(A[j]\),由上可知\(A[i+1]>X\),故交换后\(A[j]>X\),j++,故满足\(A[i+1..j-1]>X\)
    当算法运行

    终止

    交换\(A[i+1]\)和$A[r],完成划分

    快速排序的性能

    快速排序的运行时间取决于划分是否平衡,划分平衡时,快速排序性能基本和归并排序一样,否则,性能接近于插入排序.

    最坏情况划分

    当划分后的两个子问题分别为n-1个元素和0个元素时,就出现了最坏情况.不妨假设每次排序都出现了最坏情况,划分操作的时间复杂度为\(Θ(n)\)
    那么递归表达式为\(T(n) = T(n-1)+Θ(n)\)
    解为\(T(n)=Θ(n^2)\)
    .....未完待续

  • 相关阅读:
    hibernate4 无法保存 不报错
    win10开启mongodb 开启服务
    nodejs学习笔记
    mariadb Too many connections
    新老ECS数据库速度对比
    数据库自动备份并打成tar.gz包
    字符串和数组----string
    I/O复用(select)——回声服务器端/客户端
    回声UDP服务器端/客户端
    回声TCP服务器端/客户端
  • 原文地址:https://www.cnblogs.com/alex101/p/13999268.html
Copyright © 2011-2022 走看看