程序=数据结构+算法,而数据结构又离不开算法,算法中最为常用的又是排序,而排序又不止那么一点点。所以先从基本概念说起吧。
PS:这里没有绕口的概念,基本都是口头式的描述,正宗概念,请移步至……,不好意思,其实我也忘了,还是google百度一下吧,亲们。
数据,在排序中,可称之为记录。
排序:即是对一个记录集合,依照某一个或多个关键字,使记录集合按照一定的关键字排序法则(非递增或非递减关系)将记录集合排列成一个关键字有序的序列。
例:对下表进行按总分的高低排序,再按语数外高低排序,那么“总分”可称为主关键字,“语数外”可称为次关键字。
编号 | 姓名 | 总分 | 语数外 |
1 | 令狐冲 | 753 | 250 |
2 | 杨过 | 666 | 224 |
3 | 张三丰 | 753 | 251 |
编号 | 姓名 | 总分 | 语数外 |
3 | 张三丰 | 753 | 251 |
1 | 令狐冲 | 753 | 250 |
2 | 杨过 | 666 | 224 |
排序改进:一次完成上述排序,将“总分”与“语数外”当成一个字符串首尾相连,然后按照这个字符串对应数字的大小再进行排序。如:75321,753250,很快得出,张三丰排在令狐冲前面。
上面例子引出的是:多个关键字的排序最终都能转换为单个关键字的排序。即:学习时,只需讨论单个关键字的排序即可。
排序的稳定性:这个是针对排序中,不同的记录有关键字相等的情况。在关键字相等的情况下,若序列中任一组关键字相等的排序前记录和排序后记录,顺序相同,则为稳定排序,反之,为不稳的排序。 如上例:张三丰和令狐冲的总分相等,但排序前和排序后,他们的前后位置发生了改变,这即为不稳定排序。
内排序和外排序
如果待排序的记录全部放置在内存中,称之为内排序;反之,为外排序,外排序在整个排序过程中需要在内外存之间进行多次数据交换才能进行。
排序的性能因素:
时间性能
-
- 比较:指关键字之间的比较;
- 移动:指记录从一个位置移动到另一个位置。(实际情况中,多通过改变记录的存储方式来避免,比如只移动实际数据的引用)
通过尽可能的减少关键字的比较次数和记录移动次数来提高排序效率,减少时间开销。
辅助空间
指除了存放待排序所占用的存储空间之外,执行算法所需要的其他存储空间。
算法的复杂性
这里指算法本身的复杂度,非算法的时间复杂度。毕竟算法过于复杂也会影响到排序的性能。
按算法复杂度的排序分类: 直接插入排序、冒泡排序、简单选择排序 属于简单算法。而 希尔排序、快速排序、堆排序、归并排序属于改进算法。
排序算法分类:
-
- 插入排序:直接插入排序、希尔排序。
- 交换排序:冒泡排序、快速排序。
- 选择排序:简单选择排序、堆排序。
- 归并排序:归并排序。