数据结构与算法小结——排序(六)

3.2 快速排序

  快速排序综合性能优越,其主要思想在于找一个pivotvalue,通过不断的比较、交换,将序列变成pivotvalue前的值都比它小,在其后的值都比它大;然后,再对pivotvalue前面的序列和后面的序列分别使用同样的方法得到具有该性质的序列.....不断递归调用至最底层即排好序。其基本流程如图 1所示。

图 1 快速排序基本流程

  分析快速排序的时间复杂度,可以画出一个二叉树,二叉树的结点即是每一层递归选用的pivotvalue。显然,如果pivotvalue选择得当,使得递归调用的二叉树为完全二叉树,则树的深度为lgn,快速排序的时间复杂度是O(nlgn)。但如果pivotvalue的值选的不好,在最坏的情况下,递归调用成了线性表,则树的深度为n,快排的时间复杂度为n2

  所以,快排的性能很大程度上取决于pivotvalue的选取,原则应尽量使得pivotvalue为待排序的中间值。上面介绍的是选择顺序表第一个元素作为pivotvalue,更好的做法是三数取中法,即去a[low]、a[high]以及a[(high+low)/2]三者中的中间值作为枢轴pivotvalue,这样它成为待排序列中间值的概率会大很多。

  另外一处可以优化的地方是,从图中可以发现,在递归前处理中做了很多的交换,但可以发现,由于high和low的不断向中间靠拢,比较完后的值不会在参与本层递归的比较了,所以可以采取替换代替交换的方法,直接替换原来待交换的位置的值为交换以后的值即可。

  分析快速排序算法的空间复杂度,由于用了递归,需开辟栈空间,栈空间的大小即为二叉树的深度,根据上述分析可知,快排空间复杂度为O(lgn~n)。

  快排由于跳跃着交换位置,是一种不稳定的排序算法。

  总结快速排序的时间、空间复杂度,稳定性以及适用场合如图 2。

图 2 快速排序算法相关

  最后,快速排序用了递归,归并排序也有递归的算法,我想了一下它俩的区别。

  快速排序和归并排序的区别在于,归并排序通过递归分别将前一半和后一半排好序以后,整个序列还不是有序的,需要重新循环进行一个排序的步骤;但快速排序由于设置了pivotvalue,通过来回交换,已经使得前一步的所有值小于后一半的所有值了,所以分别递归排好了前一半和后一半,整个序列就是有序的了。简单来说就是,快速排序进行了递归的前处理,归并排序则进行了递归的后处理。

原文地址:https://www.cnblogs.com/lilei94/p/8400713.html

时间: 2024-08-03 15:18:01

数据结构与算法小结——排序(六)的相关文章

数据结构和算法之排序六:希尔排序

经过前面五篇排序方法的介绍,我们了解到了递归思想以及分而治之的归并和快速排序,当然也涉及到了比较简单易懂的数据值传递冒泡,选择,以及插入排序.可以说每一种排序方式都各有千秋,都适合在不同的环境下进行使用,但是我们有时会不会思考一个问题,那就是我们在学习插入排序的时候的主题思想是将每一个数据取出来,然后和后边的前边的数据逐一进行比较,那么,我们是不是要进行N-1次的循环,或者说我们是不是要进行大约N的平方次比较,我们知道,在进行值的交换和比较是非常消耗时间的,那么是不是违背了我们算法的发展.有没有

数据结构与算法小结——排序(二)

1.2 希尔排序 希尔排序属于插入排序的一种,是直接插入排序的优化,其主要思想是:由于在序列基本有序的情况下,直接插入排序的效率很高,那么,我们引入一个增量incre,把以incre为间隔的元素做一次直接插入排序,使其基本有序:随后,incre慢慢减小,继续做上述直接插入排序,最后incre变成1,退化成直接插入排序,但这时候的序列已经基本有序,排序效率非常高.实际上就是让相对较小的元素跳跃着往前移动.其过程如图所示: 希尔排序的时间.空间复杂度.稳定性以及适用场合如图: 如图所示,希尔排序的性

数据结构与算法小结——排序(三)

2. 选择排序 2.1 简单选择排序 简单选择排序的主要思想是,对第i个元素,将其与后面的n-i个元素作比较,用一个min变量存储这n-i+1个元素中的最小值的位置,比较完后将a[min]和a[i]交换(min != i).简单选择排序进行了(n^2)/2次比较,n次交换,交换的次数少. 其主要过程如图所示: 简单选择排序时间.空间复杂度.稳定性.适用场合如下: 从适用场合看到,虽然在基本的三个排序算法中,性能通常为:直接插入>冒泡>简单选择,但由于简单选择排序所需交换次数少,对于移动会花很大

数据结构与算法小结——排序(七)

4. 归并排序 4.1 递归实现 函数的递归本质上是一个压栈出栈的过程,更广意义上来说,函数调用都是压栈和出栈的过程,排序这一系列完了 ,我打算写一下函数调用和栈的关系的一章,看看能不能把这个过程理解透彻一些. 具体来说归并排序的递归实现.其主要思想是把待排序序列分为大小基本相同的两个部分,分别对前后两个部分进行同样的操作,调用自身不断压栈.到最后一层只有一个元素后,栈空间弹出栈顶元素,按照原先的切割部位,进行merge操作,见图 1. merge操作是用i.j两个变量来循环前一段元素和后一段元

python 数据结构与算法之排序(冒泡,选择,插入)

目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 计算机重要的几门课: 1.数据结构和算法 2.网络 3.操作系统 4.计算组成原理 数据结构与算法: 算法: 衡量算法的标准: 时间复杂度:就是程序代码执行的大概次数 小结: 时间复杂度是用来估计算法运行时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢 常见的

Java数据结构与算法之排序

排序从大体上来讲,做了两件事情: 1.比较两个数据项: 2.交换两个数据项,或复制其中一项 一.冒泡排序 大O表示法:交换次数和比较次数都为O(N*N). 算法原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所有的元素重复以上的步骤,除了最后一个. 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. /** * 冒泡排序 demo * */

在Object-C中学习数据结构与算法之排序算法

笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 总结与收获 参考与阅读 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧. 1.算法步骤 首先在未排序序列中找到最小(大)元素,存放到排

数据结构和算法之排序一:归并排序

我们不得不承认一个事实,java学习过程中如果我们掌握了各种编程手段和工具,确实可以做一些开发,这就是一些培训机构敢告诉你几个月就能掌握一门语言的原因.但是随着时间的发展,我们总会感觉,这一类人如果不提升自己,最后也只会是一个码农.技术会日新月异,随时在发展更新换代,但是这几十年,有谁说过算法会过时,如果我们说java语言的发动机是各种开发手段和技术,那么我们可以毫不客气的说算法会是他的灵魂.一个程序员的提升和拔高一定是万丈高楼平地起,那么我希望这个地基一定是数据结构和算法,掌握这些原理以后其实

javascript数据结构与算法--高级排序算法

高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法---- 希尔排序和快速排序. 一:希尔排序: 希尔排序的核心理念是:首先比较距离较远的元素,而非相邻的元素. 基本原理:通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔. 下面我们来看看数组[0,9,1,8,7,6,2,3,5,4] 来使用希尔排序的原理:如下图: 代码分析如下: 1. 执行 "间隔序列=3的步骤" A.