排序也是数据库中非常非常常见的场景,很多数据的数值字段的顺序具有非常重要的意义,比如我们要选择近期消费的客户并且按照消费得多少排序,形成数据表格,即
SELECT * FROM CUSTOMER ORDER BY ORDER_AMOUT LIMIT 100
在这个场景中,我们就需要查找出数据并且进行排序,那么常用的排序算法有哪些呢。
内排序算法
内排序是被排序的数据元素全部存放在计算机内存中的排序算法。内部排序是指待排的记录全部在内存中完成排序的过程,内部排序也称为内排序。
快速排序
快速排序是最常用的排序算法,由Tony Hoare在1959年发明。顾名思义,快速排序的特点就是“快”。快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
堆排序
堆是一种近似完全二叉树的结构,最大值堆要求每个子节点的键值总是小于父节点。最小值堆相反,要求每个子节点的键值总是大于父节点。
堆排序算法的实际过程分成三步:
步骤1:建立最大值堆,最大元素在堆顶;
步骤2:重复将堆顶元组移除并插入到排序数组,更新堆使其保持堆的性质;
步骤3:当堆的元素个数为零时,数组排序完毕;
外排序
若待排序记录的数量庞大,在排序的过程中需要使用到外部存储介质如磁盘等,这种涉及内外存储器数据交换的排序过程称为外部排序,又称为外排序。
比如说我们在如果查看mysql的执行计划有时候会看到 filesort,这个filesort 就是外排序
外排序一般是基于归并排序。
归并排序的过程分为两个阶段:
阶段一是分割阶段,将原始待排序数据分成若干个顺串;
阶段二是合并阶段,将所有小顺串合并成一个包含所有数据的大顺串;
以上就是数据库所以使用的常见排序算法