排序
排序是指将一组数据,按照特定规则调换位置,使数据具有某种顺序关系。
排序的移动方式可分为直接移动和逻辑移动。
直接移动是直接交换存储数据的位置,逻辑移动是改变指向这些数据的辅助指针的值。
排序的分类
排序通常按照数据量的多寡和所使用的内存可分为内部排序和外部排序,数据量小则可以全部加载到内存来进行的排序称为内部排序。
内部排序法
- 冒泡排序法
原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有无,则对调再进行下一个元素的比较,就仿佛气泡逐渐从水底逐渐冒升到水面一样。如此扫描过一次之后就可以确保最后一个元素是位于正确的顺序。接着再逐步进行第二次扫描,指导完成所有的排序关系为止。 - 选择排序法
开始在所有数据中挑选一个最值放在第一个位置,再从第二项开始挑选一个最值放在第二个位置,直到完成排序为止。 - 插入排序法
是将数组中的元素,逐一与已排序好的数据进行比较,前两个元素先排好,再将第三个元素插入适当的位置,所以这三个元素仍然是已排好的,接着再将第四个元素加入,重复此步骤,直到排序完成为止。 - 希尔排序法
当原始记录的键值大部分已排好序的情况下,插入排序发会非常有效率,D.L.Shell将数据区分成特定间隔的几个小区快,以插入排序法拍完区域内的数据后再减少间隔的距离。 - 合并排序法
通常是外部存储器最常用的排序方法,工作原理乃是针对已排好序的两个或两个以上的文件,通过合并的方式,将其组合成一个大的且已排好序的文件,步骤如下:
1)将N个长度为1的键值,成对地合并成N/2个长度为2的键值组。
2)将N/2个长度为2的键值组,成对地合并成N/4个长度为4的键值组。
3)将键值组不断地合并,直到合并成一组长度为N的键值组为止。 - 快速排序法
快速排序法又称分割交换排序法,是目前公认的最佳的排序法,先在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分,其中小于中间值的数据放在左边,而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排完为止。 - 基数排序法
基数排序法按比较的方向可分为最高位优先和最低为优先两种,MSD法是从左边的位数开始比较,而LSD是从最右边的位开始比较。
外部排序法
1. 直接合并排序法
2. k路合并法
3. 多相合并法