内部排序 外部排序 稳定排序 不稳定排序

 

内部排序 外部排序

https://baike.baidu.com/item/内部排序

内部排序是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。
 
 
排序是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列。排序分为两类:内排序和外排序。
其中快速排序是排序方法中被认为是最好的方法。
4.归并排序 [1]  ;
希尔排序是对直接插入排序方法的改进。
8.基数排序;
 
 

 

 

 

(日期,订单金额)二元数序列
(1,100),(2,100),(2,200),(2,100),(1,80),(4,500)

 

按照日期增序排
(1,100),(1,80),(2,100),(2,200),(2,100),(4,500)
对上边序列按照金额增序排
(1,80),(1,100),(2,100),(2,100),(2,200),(4,500)

 


比如说,我们现在要给电商交易系统中的“订单”排序。
订单有两个属性,一个是下单时间,另一个是订单金额。
如果我们现在有 10 万条订单数据,我们希望按照金额从小到大对订单数据排序。
对于金额相同的订单,我们希望按照下单时间从早到晚有序。
对于这样一个排序需求,我们怎么来做呢?

最先想到的方法是:我们先按照金额对订单数据进行排序,然后,再遍历排序之后的订单数据,对于每个金额相同的小区间再按照下单时间排序。这种排序思路理解起来不难,但是实现起来会很复杂。

 

11 | 排序(上):为什么插入排序比冒泡排序更受欢迎? https://time.geekbang.org/column/article/41802

借助稳定排序算法,这个问题可以非常简洁地解决。解决思路是这样的:我们先按照下单时间给订单排序,注意是按照下单时间,不是金额。排序完成之后,我们用稳定排序算法,按照订单金额重新排序。两遍排序之后,我们得到的订单数据就是按照金额从小到大排序,金额相同的订单按照下单时间从早到晚排序的。为什么呢?

 

 

 

借助稳定排序算法,这个问题可以非常简洁地解决。解决思路是这样的:我们先按照下单时间给订单排序,注意是按照下单时间,不是金额。排序完成之后,我们用稳定排序算法,按照订单金额重新排序。两遍排序之后,我们得到的订单数据就是按照金额从小到大排序,金额相同的订单按照下单时间从早到晚排序的。为什么呢?稳定排序算法可以保持金额相同的两个对象,在排序之后的前后顺序不变。第一次排序之后,所有的订单按照下单时间从早到晚有序了。在第二次排序中,我们用的是稳定的排序算法,所以经过第二次排序之后,相同金额的订单仍然保持下单时间从早到晚有序。冒泡排序(Bubble Sort)我们从冒泡排序开始,学习今天的三种排序算法。冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。我用一个例子,带你看下冒泡排序的整个过程。我们要对一组数据 4,5,6,3,2,1,从小到大进行排序。第一次冒泡操作的详细过程就是这样:可以看出,经过一次冒泡操作之后,6 这个元素已经存储在正确的位置上。要想完成所有数据的排序,我们只要进行 6 次这样的冒泡操作就行了。实际上,刚讲的冒泡过程还可以优化。当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。我这里还有另外一个例子,这里面给 6 个元素排序,只需要 4 次冒泡操作就可以了。冒泡排序算法的原理比较容易理解,具体的代码我贴到下面,你可以结合着代码来看我前面讲的原理。// 冒泡排序,a表示数组,n表示数组大小public void bubbleSort(int[] a, int n) { if (n <= 1) return; for (int i = 0; i < n; ++i) { // 提前退出冒泡循环的标志位 boolean flag = false; for (int j = 0; j < n - i - 1; ++j) { if (a[j] > a[j+1]) { // 交换 int tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; flag = tr

posted @ 2016-08-24 22:22  papering  阅读(303)  评论(0编辑  收藏  举报