简单排序算法

来源:互联网 发布:数据质控校验结果报告 编辑:程序博客网 时间:2024/05/08 20:49
稳定排序:
如果两个数相同,对它们进行的排序结果中它们的相对顺序不变。
原地排序:
不申请多余的空间进行的排序。

1.冒泡排序

思路:对于每一趟排序,比较相邻的两个元素,看是否满足大的在后的规律(假定是递增排序)。如果不是,交换这两个元素。每趟排序结束后,当前遍历所有元素的最大值就被移到了最后。注意每次遍历的元素个数是不一样的,因为最后一个元素已经是最大的了,所以每次只要遍历前面n-1个元素就可以了。想想循环条件应该怎么控制?

任务:
1.实现冒泡排序的算法,并自行测试。粘贴。

2.冒泡排序的时间复杂度?平均时间复杂度?最好时间复杂度?最差时间复杂度?
O(n^2),O(n),O(n^2)
外层和内层循环的计算,常量不用表示在时间复杂度中。

3.稳定性及原地性如何?
稳定排序(不会出现数据跳变),原地排序

WWL:


1s 冒泡排序改进

想想如下序列,5 1 2 3 4,只要第一趟排序后就已经有序,不必再进行接下来的排序。可是传统的冒泡排序还是走完n趟排序的流程。那么怎么改进呢?提示:设置一个标志,如果一趟排序中已经没有任何交换发生,那么说明数列已经有序,排序可以结束。

任务:实现冒泡排序的改进算法。



2.直接选择排序

直接选择排序的基本思想:将数据分为有序区和无序区。每次从无序区中选择一个最小的元素放到有序区的最后形成一个更大的有序区。

任务:
1.实现直接插入排序算法;
2.分析直接插入排序的时间复杂度:平均时间复杂度,最好时间复杂度,最差时间复杂度;
   O(n^2);O(n);O(n^2)
3.稳定性及原地性。
原地排序
非稳定的原因是做交换的时候会导致相同的数顺序颠倒
这个算法的稳定性是有争议的。
对于采用选出最小元素并将最小元素放到一个专门开出来的存储区的,则是稳定的。(这种说法则说明该算法是稳定的)




3.直接插入排序

直接插入排序与直接选择排序类似,不过直接插入排序试讲无序区的第一个关键字插入到有序区的正确位置上,依次遍历,直到全部记录插入完成。

任务:
1.实现直接插入排序算法;
2.分析直接插入排序的时间复杂度;
最小O(n);平均O(n^2);最差O(n^2)
3.稳定性及空间复杂度。
稳定算法,空间复杂度O(1),不需要开辟新的空间


所有基于比较的排序,最好的时间复杂度是O(nlogn);


4.希尔排序

即缩减增量排序(分组插入排序)。
先将整个待排元素序列分割成若干个子序列(由相隔某个增量的元素组成)分别进行直接插入排序,然后依次缩减增量再进行排序。待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

例:               81 94 11 96 12 35 17 95 28 58 41 75 15
gap=5           81 94 11 96 12 35 17 95 28 58 41 75 15
sorted            35 17 11 28 12 41 75 15 96 58 81 94 95
gap=3           35 17 11 28 12 41 75 15 96 58 81 94 95
sorted            28 12 11 35 15 41 58 17 94 75 81 96 95
gap=1           28 12 11 35 15 41 58 17 94 75 81 96 95
sorted            11 12 15 17 28 35 41 58 75 81 94 95 96

最简单的希尔排序的增量选取是(n/2^i),即即希尔增量,数组长度的一半开始,每次迭代减半。还有其他一些增量选取的方式,能够使得算法效率更高。

任务:
1.实现希尔排序算法;
2.分析时间复杂度;
O(n^(m)) (1<m<2)
3.分析稳定性及空间复杂度。
不稳定算法,空间复杂度为O(1),原地排序

(注意检查,有时候编译器会做优化,隐藏了bug)


你这个时间复杂度是不大于O(n^2)吗??
自己算的觉得应该O(n^4)但是看资料说是不大于O(n^2)
这个是参考了一下more windows的博客

不是有一个for就是O(n)的复杂度,尤其是我给你说过,i如果是成倍增长的话,那复杂度就只有logn.

要理解透第二个和第三个for循环的意义
第二个for并不是在控制分组,控制分组是第二个和第三个一起控制的
因为在最后一个for中,j -= pace控制了比较的间隔,也就是说,每一次完整的比较,就是在一个组内进行的
而i就是起到了让j去做一次完整的比较,而这个完整的比较,就是每间隔pace的数,也就是一个组

5.归并排序

分治法的应用,基本思想,合并两个已排好序的序列,使之成为一个排好序的序列。

任务:
1.实现归并排序算法;
2.时间复杂度分析;
O(nlogn) 不知道怎么算,看资料的
3.稳定性及空间复杂度分析。
稳定排序,空间复杂度是O(n)





6.快速排序

结合
http://dongxicheng.org/structure/structure-algorithm-summary/
http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html
以及MoreWindows的博客(在火狐浏览器的blog标签下都有)深入理解快速排序内涵。要求知道每一步是怎么完成的。理解为什么快。理解普通快速排序的缺陷及改进的方法。

1.实现快速排序算法。普通的以第一个元素为枢纽元的即可。

这个是我按照morewindows的思路写出来的,填坑的方式,
思路是后面j填坑之后,前面i填坑,然后再从j来填
http://blog.csdn.net/morewindows/article/details/6684558

看看有什么问题,测试过了
这个是用例

2.时间复杂度及空间复杂度分析。
时间复杂度O(nlogn),不明白怎么算的,看的资料,空间复杂度O(1)

3.实现或者理解快速排序改进版(不以第一个元素为枢纽元)的方法。
还没有看
4.快速排序的非递归实现。


0 0