各种排序算法分析

1.各种算法的分析与比较


1.冒泡算法是排序算法中比较常用的一种,他进行N-1次循环,单次循环把最大的数移到最后面,这样较大的数逐渐向后移,最后数组变成为有序状态。

2.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的第一个元素,此时可以认定这个数组已经排好序;第二部分是剩余的数组元素,处于无序状态,然后依次把第二个数组的首元素插入到第一个数组中进行排序,排序过程中把元素与第一个数组的元素依次进行比较,最后得到应有的顺序,即完成这一元素的排序。

3.合并排序是一种基于时间复杂度为O(nlgn)的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,首先它把待排序序列分为若干个子序列,在每个子序列内部进行排序使每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 将已有序的子序列合并,得到完全有序的序列;以此可以看出此排序算法与数组的大小N还有数组的二分的深度有很大的时间关系,这也是其时间复杂度为O(nlgn)的主要原因。

4.快速排序是对冒泡算法的一种改进,她首先通过一趟排序把数据分成两大部分,其中第一部分的数值都要小于第二部分,然后在这两部分中都再次进行平分,每次分完后前一部分都比后一部分的数值要小,等到分完后的数组大小为1时,排序也就完成了,整个数的前面一个数值都要小于后面一个数值。在待排序数组A[0]……A[N-1]中首先选用第一个数据作为关键数据key,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法。经证明,其时间复杂度为O(nlgn),空间复杂度O(nlgn),因为递归时函数调用的堆栈需要内存空间。

5.希尔排序是插入排序的一种,是针对插入排序算法的改进。首先取一个小于N的整数d1作为第一个增量,把数组的全部元素,分为d1个组,即所有数组下标相距为d1的元素放在一个组内,然后在单个的组内进行直接的插入排序,既通俗所说的插入排序,然后去第二个增量d2<d1进行分组,然后再进行排序,因为前面的很多元素已经是有序的,所以第二次排序过程中不需要经过太多的数值交换,大大减少了时间的复杂度。依次进行下去,直到所有的元素放在同一个组中,排序即完成。优点:不需要大量的辅助空间,希尔排序的时间复杂度为O(N*(logN)2),比快速排序算法的时间复杂度O(N*(logN))要慢一些,因此中等大小规模表现良好,对规模非常大的数据排序不是最好的选择,但是比O(N2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。

6.桶排序是最复杂的算法,我首先将区间[0, 1)划分为n个大小相等的子区间(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),待排列的数据按照他们的大小分别放入对应的区间,此时桶与桶之间的大小是有序的。然后对桶中元素进行排序,可使用快速排序。桶排序具有很好的时间复杂度,但是他的缺点就是对空间比较浪费,空间充足的情况下,桶排序具备接近线性的时间复杂度,桶排序的平均时间复杂度为线性的O(N+C),其中C=N*(logN - logM)。相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度达到O(N)。桶排序的空间复杂度为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。

总的来说,希尔排序,快速排序,桶排序,合并排序的时间要远小于插入排序和冒泡排序,基于时间复杂度为O(N^2)的排序算法为插入排序和冒泡排序,基于时间复杂度为O(NlogN)的排序算法为快速排序,合并排序。希尔排序的时间复杂度为O(N*(logN)2),桶排序时间复杂度最低,接近线性。

2.各种算法程序清单

(1)插入排序。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值