冒泡排序的优化以及快排过程及优化

输入图片说明

冒泡排序的优化:

1.加入哨兵。2.记住每一次交换的最后位置,该位置以后的为有序,不需要改变。

1、快速排序的基本思想:

快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

2、快速排序的三个步骤:

(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot)

(2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大

(3)递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。

3、选择基准的方式

对于分治算法,当每次划分时,算法若都能分成两个等长的子序列时,那么分治算法效率会达到最大。也就是说,基准的选择是很重要的。选择基准的方式决定了两个分割后两个子序列的长度,进而对整个算法的效率产生决定性影响。

最理想的方法是,选择的基准恰好能把待排序序列分成两个等长的子序列

我们介绍三种选择基准的方法:1.固定位置。 2.随机选取基准。3.三数取中。输入图片说明

快排的优化:

1.第一种方法就是当待排序序列的长度分割到一定大小后,使用插入排序。原因是因为对于很小和部分有序的数组,快排不如插排好。当待排序序列的长度分割到一定大小后,继续分割的效率比插入排序要差,所以此时我们可以使用插入排序而不是快速排序。

2.第二种优化方法就是在一次分割结束后,可以把与枢纽key相等的元素聚在一起,继续下次分割时,不再对与key相等元素分割。在处理过程中,会有两个步骤:

第一步是在划分的过程中,把与key相等的元素放入数组的两端。。。。。。第二步是在划分结束后,把与key相等的元素移到移到枢轴(基准数)周围。

3.还有一种就是三数取中也就是中轴数的选取,因为最佳的划分是将待排序的序列分成等长的子序列,最佳的状态我们可以使用序列中间的值,也就是第N/2个数。可是,这很难算出来,并且会明显减慢快速排序的速度。这种中值的估计是可以通过随机选取三个元素并用它们的中值作为枢纽元而得到。但事实上,随机性并没有多大的帮助,所以一般的做法就是说使用左端、右端和中心位置上的三个元素的中值作为枢纽元。(使用三数中值分割法消除了预排序输入的不好情形) 减少快排大约14%的比较次数

4.优化递归操作 快排函数在函数尾部有两次递归操作,我们可以对其使用尾递归优化。。。。。优点:如果待排序的序列划分极端不平衡,递归的深度将趋近于n,而栈的大小是很有限的,每次递归调用都会耗费一定的栈空间,函数的参数越多,每次递归耗费的空间也越多。优化后,可以缩减堆栈深度,由原来的O(n)缩减为logn。即如下low = provit+1

猜你喜欢

转载自my.oschina.net/134596/blog/1648185