内排序:指在排序期间数据对象全部存放在内存排序;
外排序:指大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次全部加载到内存中,需要在内存和外部存储器之间进行多次数据交换,以达到整个排序文件的目的。
分类 |
排序算法 |
排序基本思想(升序) |
交换排序 |
冒泡排序 |
1、首先将第1个和第2个关键字比较大小,如果第1个比第2个大,则交换,再对第2个和第 3个进行比较,以此类推,重复进行上述计算,直到完成第(n-1)和第n个记录关键字进行比较; 2、再按照上述方式进行第2次、第3次排序,直到整个序列有序为止; |
快速排序 |
1、从数列中找出一个基准值 2、将所有比基准值小的放在基准值的前面,比基准值大的放在基准值的后面; 3、递归的把基准值前面的子数列和基准值后面的子数列进行排序 |
|
插入排序 |
简单插入排序 |
1、将n个待排序的元素看成一个有序表和一个无序表; 2、开始时有序表表只含有1个元素,无序表含有n-1个元素; 3、每次从无序表中取出1个元素,将它插入到有序表中适当的位置,使之成为新的有序表,重复n-1次可完成排序过程; |
希尔排序(对插入排序的改进又名缩小增量排序) |
1、先取小于n的整数d1作为第一个增量,把文件的全部记录分组,所有距离为d1的倍数分为一组,对每组进行直接插入排序; 2、取第2个增量d2<d1,重复上述的分组和排序,直至增量dt = 1,即所有记录放在同一组中进行直接插入排序; |
|
选择排序 |
简单选择排序 |
1、从n个待排序列中选出最小的一个放在序列的起始位置; 2、然后从剩余未排序中找出最小的元素,放在已排序序列的末尾; 3、以此为推,直到所有待排序列的元素为零; |
堆排序(完全二叉树的结构) |
大顶堆: 每个结点的值都大于或等于其子结点的值;(升序排序) 小顶堆:每个结点的值小于或等于其子结点的值;(降序排序) 1、将待排序列构造成一个大顶堆; 2、将顶端的数有末尾的数交换,此时末尾的树为最大数; 3、将剩余的n-1个数构造成大顶堆,再将顶端树与n-1位置的数交换,如此反复的执行; |
|
归并排序 (分治算法:将一个大的问题划分为n个规模较小而结构相似的子问题) |
二路归并 |
二路归并排序的宗旨:”分解”与归并 1、分解: A将一个数组分成两个数组,分别对两个数组进行排序; B循环第一步,直到划分出来的小数组只包含一个元素,只有一个元素的数组默认已经排好序; 2、归并: A将两个有序的数组合并到一个大的数组中 B从最小的只包含一个元素的数组开始两两合并; |
多路归并排序 |
1、按可用内存的大小,将大文件拆分为M个子文件; 2、使用内部排序分别对M个子文件进行排序; 3、创建M个优先队列,每个队列从对应的文件中读取TOPN个元素; 4、从M个队列中各选择一个数进入中转优先队列,并将数字打上对应队列的标记, 中转站队列出来的最小数字就是要排序的数字之一,同时通知对应编号的队列继续出数字进入中转队列; 5、中转站一直保存着M个数字,当中转站中所有的数都出队列则排序结束。 |