zoukankan      html  css  js  c++  java
  • 快速排序 Quick Sort

    快速排序是基于分治策略.
     
    步骤:
         1、分解:数组A[p..r]划分为两个子数组 A[p..q-1]和A[q+1.. r]。使得A[p..q-1]中元素都小于A[q],A[q+1.. r]中元素都大于A[q]。
         2、解决:递归调用快速排序,对数组 A[p..q-1]和A[q+1.. r]排序。
         3、合并:因为都是原地排序,所以不需要合并。整个数组A[p..r]已排序。
     
     
    QuickSort(A, p, r)
     1    if p<r
     2         q=Partition(A, p, r)
     3         QuickSort(A, p, q-1)
     4         QuickSort(A, q+1, r)
     
    快速排序的关键是Partition过程,它对数组A[p..r]进行原地重排。
     
    Partition(A, p, r)
    1     x=A[r]     //确定主元 pivot element 
    2     i=p-1
    3     for  j=p to r-1
    4          if A[j]<=x
    5               i=i+1
    6               exchange A[i] with A[j]     // A[p..i]都是小于等于A[r]的元素
    7     i=i+1
    8     exchange A[i] with A[r]
    9     return i
     
    分析:for循环过程中的四个区域:小于等于主元区域、大于主元区域、待扫描区域、主元

      

    随机化的版本:随机选择主元,使对数组的划分比较对称,以获得较好的平均性能。
    RandomizedPartition(A, p, r)
    1     i=Random(p,r)
    2     exchange A[i] with A[r]
    3     return Partition(A, p, r)
     
     
    运行时间
         对包含n个元素的数组,最坏情况运行时间为Θ(n2
         平均性能相当好:期望的运行时间为Θ(n lg n),且Θ(n lg n)记号中隐藏的常数因子很小。所以快速排序通常是用于排序的最佳选择。
     
     
     
  • 相关阅读:
    join
    Hadoop 的 TotalOrderPartitioner
    机器学习开源项目
    java 编程性能调优
    kettel的stream lookup报错
    Mondrian Schema workbench工作界面 简介(实在懒得写,居然有人弄了,收藏了)
    linux软链接和硬链接
    那些超级成功的公司(看着不错,自己收藏)
    Ngnix中的fastcgi參数性能优化和解释
    zip 的 压缩与解压
  • 原文地址:https://www.cnblogs.com/windlaughing/p/3092777.html
Copyright © 2011-2022 走看看