博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序
阅读量:4326 次
发布时间:2019-06-06

本文共 1536 字,大约阅读时间需要 5 分钟。

快速排序的基本思想是,通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于 已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。
通过两个不相邻元素交换,可以一次交换消除多个逆序,加快排序速度。快速排序方法在要排序的数据已经有序的情况下最不利于发挥其长处。

 
描述:定义left指针、right指针、base基准数。通过一遍便利让left指针和right指针重合,此时数组就被分成了两部分了。
 
案例:

下面我们通过一个案例来演示一下快速排序的基本步骤: 以序列 46 30 82 90 56 17 95 15   共8个元素

    初始状态:     46  30  82  90  56  17  95  15        选择46 作为基准值,i = 0, j = 7

           i = 0                                j = 7

                   15  30  82  90  56  17  95  46       15 < 46, 交换 15 和 46,移动 i, i = 1

             i = 1                           j = 7

            15  30  82  90  56  17  95  46       30 < 46, 不需要交换,移动 i , i = 2

               i = 2                   j = 7

            15  30  46  90  56  17  95  82       82 > 46, 交换82 和 46,移动 j , j = 6

               i = 2               j = 6

            15  30  46  90  56  17  95  82       95 > 46, 不需要交换,移动 j , j = 5

               i = 2         j = 5

            15  30  17  90  56  46  95  82       17 < 46, 交换46 和 17,移动 i, i = 3

                 i = 3    j = 5

            15  30  17  46  56  90  95  82       90 > 46, 交换90 和 46,移动 j , j = 4

               3 = i    j = 4

            15  30  17  46  56  90  95  82       56 > 46, 不需要交换,移动 j , j = 3(最关键的就是在这里停掉了)

                     i  =  j = 3

    

    i = j = 3, 这样序列就这样分割成了两部分,左边部分{15, 30, 17} 均小于 基准值(46);右边部分 {56, 90,95,82},均大于基准值。这样子我们就达到了分割序列的目标。在接着对子序列用同样的办法进行分割,直至子序列不超过一个元素,那么排序结束,整个序列处于有序状态。

 

 

快速排序算法效率与稳定性分析

  当基数值不能很好地分割数组,即基准值将数组分成一个子数组中有一个记录,而另一个子组组有 n -1 个记录时,下一次的子数组只比原来数组小 1,这是快速排序的最差的情况。如果这种情况发生在每次划分过程中,那么快速排序就退化成了冒泡排序,其时间复杂度为O(n2)。

  如果基准值都能讲数组分成相等的两部分,则出现快速排序的最佳情况。

快速排序在进行交换时,只是根据比较基数值判断是否交换,且不是相邻元素来交换,在交换过程中可能改变相同元素的顺序,因此是一种不稳定的排序算法。

 

 

 

 

来源: 

 

转载于:https://www.cnblogs.com/wzdnwyyu/p/11168963.html

你可能感兴趣的文章
SSL协议之数据加密过程详解
查看>>
Mybatis <if>标签
查看>>
Hibernate HQL详解
查看>>
IOS学习之斯坦福大学IOS开发课程笔记(第六课)
查看>>
详解C# 匿名对象(匿名类型)、var、动态类型 dynamic
查看>>
centos7 开放端口
查看>>
迷宫实现
查看>>
如何使用Transact-SQL进行事务处理[示例]
查看>>
选择JSF不选Struts的十大理由
查看>>
01-编写CMS注意事项
查看>>
SQL 事务
查看>>
element的form表单中如何一行显示多el-form-item标签
查看>>
SQL Server两种分页的存储过程介绍
查看>>
09 audio和vedio标签
查看>>
【HDU 6299】Balanced Sequence
查看>>
【】minimum
查看>>
【CS Round #46 (Div. 1.5) B】Letters Deque
查看>>
自制常用工具类Common
查看>>
hdoj 4940 强连通图
查看>>
Shell脚本编写
查看>>