排序就是将一组对象按照某种逻辑顺序重新排列的过程。数据无处不在,而整理数据的第一步通常就是进行排序。或者说我们解决别的问题的第一步常常是排序。目前,排序一般封装于包的排序函数。具体呈现于事务处理、语言处理、数学等。排序算法具体呈现于任何实现了 Comparable 接口的数据类型。例如Java 中的 Integer 、 Double、 String 和许多引用数据类型如 File。常见的排序过程有:
- 选择排序
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。
我们注意到,一个已经有序的数组和一个元素随机排列的数组所用的排序时间一样长。 - 插入排序
- 希尔排序
- 归并排序
即将两个有序的数组归并成一个更大的有序数组。 - 快速排序
快速排序是一种分治的排序过程。它将一个数组分成两个子数组,将两部分独立地排序。输入-打乱-切分-切分元素左排序右排序-归并。基于分治算法策略,设定一个基准线(privot)。基准线就是一个基准数。通常取该数组的第一个数。比这个数大的放在右边。比这个数小的放在左边。这样一个数组就一分为二。依此类推。 - 堆排序(优先队列)
在某些数据处理的例子里,总数据量太大,无法排序(甚至无法全部装进内存)。例如你需要从 10 亿个元素中选出最大的十个,一个 10 亿规模的数组排序。但使用优先队列,你就只用一个能存储十个元素的队列即可。此外,有时我们甚至无法同时获取所有的数据,因此只能先从优先队列中取出并处理一部分,然后再根据结果决定是否向优先队列中添加更多的数据。