各种排序学习归纳总结(Java)
排序总结
根据《数据结构与算法分析——Java语言描述》《INTRODUCTION TO JAVA PROGRAMMING》、维基及各技术博客知识点来总结的。
如果刚入门学习Java的同学,推荐看Y.Daniel.Liang的这本《INTRODUCTION TO JAVA PROGRAMMING》,建议看英文版的,作者是中国人,所以语句很容易理解的,而且简单,易懂。(有IPad直接下PDF高清版的,不会的单词可以随时查阅,还有助于学习英语)
一、 排序的基本概念:
排序分两类,内部排序和外部排序。内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存,通过借助内存调整数在外存储的排放顺序,内部排序适用于记录个数不很多的较小待排序文件的排序;外部排序则适用于记录个数太多不能一次全部放入内存的较大待排序文件的排序。
二、 内部排序(internal sorting):
排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序
a) 插入排序(insertion sort)
i. 简单插入排序(simple insertion sort)—— O(n2)
insertionsort例程:
ii. 希尔排序(Shell sort)—— O(n log2 n)
Shellsort例程:
iii. 二分法插入排序
iv. 二路插入排序
b) 选择排序(selection sort)
i. 简单选择排序(simple selection sort)—— O(n2)
gif图片
c) 堆排序(heap sort)—— O(n log n)
d) 交换排序
i. 冒泡排序(bubble sort)—— O(n2)
ii. 鸡尾酒排序(cocktail sort)—— O(n2)
gif图片
e) 快速排序(quick sort)—— O(n log n)
f) 归并排序(merge sort)—— O(n log n)
1.归并排序:
2.原地归并排序:
归并排序中,用到了System.arraycopy:
System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。 注意:src and dest都必须是同类型或者可以进行转换类型的数组. 有趣的是这个函数可以实现自己到自己复制,比如: int[] fun ={0,1,2,3,4,5,6}; System.arraycopy(fun,0,fun,3,3); 则结果为:{0,1,2,0,1,2,6}; 实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos 到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).
g) 基数排序/桶排序(radix sort/ bucket)—— O(n·k)
gif图片
三、 内部排序的方法比较
a) 时间复杂度
b) 空间复杂度
c) 稳定性
d) 其他
平均时间复杂度由高到低为:
说明:虽然完全逆序的情况下,快速排序会降到选择排序的速度,不过从概率角度来说(参考信息学理论,和概率学),不对算法做编程上优化时,快速排序的平均速度比堆排序要快一些。
四、 外部排序(External Sorting):排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序
归纳总结表:
最后看看这个排序的视频乐一乐吧
http://www.bilibili.com/video/av685670/
正在编辑中。。。
新人学习总结,大神请勿喷