内部排序简单来说,就是在内存中存放待排序数据元素进行排序的过程。
内部排序简单分为:插入排序,快速排序,选择排序,归并排序,基数排序。
一、插入排序:
1、直接插入排序:利用顺序查找在已形成的有序表中查找,在适当的位置插入待插入元素,后面元素的地址向后顺移。
时间效率:O(n2),空间效率:n(1),算法稳定,链表结构效率更高。
2、折半插入排序:在已形成的有序表中折半查找,在适当位置插入,后面元素向后顺移。查找过程中每次比较待插入元素和子表中MID元素,确定下一次查找的子表。
时间效率:O(n2),空间效率:n(1),算法稳定,链表结构无法进行“折半”。
如图:
3、希尔(shell)排序:将相隔某个增量的两个记录两两排序,不断缩小增量至1为止来不断重复这个过程,先作“宏观”调整,再做“微观”调整。
时间效率:O(n1.25)~O(1.6n1.25)——经验公式(大量的实验统计资料得出),空间效率:n(1),算法不稳定,不容易在链表上实现。
如图:
二、快速排序:
1、气泡排序:相邻记录两两比较并交换。
时间效率:O(n2),空间效率:n(1),算法稳定,必须是顺序存储结构。
2、快速排序:对气泡排序的改进,在待排序元素中任取一元素作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表,在子表中重复这一过程 至序列有序。
时间效率:O(nlog2n) —因为每趟确定的元素呈指数增加,空间效率:O(log2n)—因为算法的递归性,要用到栈空间。算法不稳定。
三、选择排序:
1、简单选择排序(又称为直接选择排序):在待排序序列中选择最小的一个元素放置于序列靠前的位置,在无序序列中不断重复这3个过程至序列有序。
时间效率:O(n2),空间效率:n(1),算法不稳定。
2、树型选择排序:对n个记录两两比较,选择其中较小的,再对这些较小的两两比较,选出较小的,重复至找到最小元素,之后将其输出,要找次小关键字只需将叶子结点中的最 小关键字改为“最大值” ,然后从该叶子结点开始,重复上述步骤即可。
时间效率:O(n㏒2n),空间效率较差 。
3、堆排序:堆是一棵采用顺序存储结构的完全二叉树,堆的根结点是关键字序列中的最小(或最大)值,利用堆顶记录的关键字值最小(或最大)的性质,从当前待排序的记录中依次 选取关键字最小(或最大)的记录,就可以实现对数据记录的排序。当输出堆顶元素后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与 其中小者进行交换;重复上述操作。
时间效率:O(n㏒2n),空间效率:n(1)。
四、归并排序:是指将两个或两个以上的有序序列合并成一个有序序列。若采用线性表易于实现。
初始时,将每个记录看成一个单独的有序序列,则n个待排序记录就是n个长度为1的有序子序列,之后对所有有序子序列进行两两归并,得到n/2个长度为2或1的有序子序列 ——一趟归并;重复上述步骤 ,直到得到长度为n的有序序列为止。
五、基数排序:待补充。