数据统计表
如何有限呢?PI 128M 8G?
不知道整数是多大的。。。
数据的排序有很多种比如:冒泡、选择、插入、快速、希尔、堆排序、双向冒泡、归并、分配、基数等等,其中目前复杂度为【N×(log2N)】的算法是认为比较好的算法,而上述几种算法中“快速排序”的复杂度是其中符合的算法之一,且对于N值比较大的情况下,大部分人会选择此排序算法。
有关快速排序法在网上有很多讲解,下面转载一些比较好的链接:
一:各个排序算法讲解链接(以下链接主要来自百度百科)
1、冒泡排序:http://baike.baidu.com/view/254413.htm
2、选择排序:http://baike.baidu.com/view/547263.htm
3、插入排序:http://baike.baidu.com/view/396887.htm
4、快速排序:http://baike.baidu.com/view/115472.htm
5、希尔排序:http://baike.baidu.com/view/178698.htm 和 http://baike.baidu.com/view/549624.htm
6、堆排序:http://baike.baidu.com/view/157305.htm
7、双向冒泡排序(与冒泡排序基本相同):<略>
8、归并排序:http://baike.baidu.com/view/90797.htm 和 http://www.programfan.com/blog/article.asp?id=12677
9、分配排序:http://blog.chinaunix.net/u1/50617/showart_544048.html (含归并排序内容)
10、基数排序:http://baike.baidu.com/view/1170573.htm
二、几种排序算法的比较和选择
1. 选取排序方法需要考虑的因素:
(1) 待排序的元素数目n;
(2) 元素本身信息量的大小;
(3) 关键字的结构及其分布情况;
(4) 语言工具的条件,辅助空间的大小等。
2. 小结:
(1) 若n较小(n <= 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。
(2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。
(3) 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序是目前基于比较的内部排序法中被认为是最好的方法。
(4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。
(5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。
三、排序算法稳定性(以下内容转载自:http://baike.baidu.com/view/547325.htm)
若待排序的序列中,存在多个具有相同关键字的记录,经过排序, 这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对 次序发生了改变,则称该算法是不稳定的。
假定在待排序的记录序列中,存在多个具有相同键值的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ki=kj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。
例如,对于如下起泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成r[j]>=r[j+1],则两个相等的记录就会交换位置,从而变成不稳定的算法。
void BubbleSort(int r[ ], int n){
exchange=n; //第一趟起泡排序的范围是r[1]到r[n]
while (exchange) //仅当上一趟排序有记录交换才进行本趟排序
{
bound=exchange; exchange=0;
for (j=1; j if (r[j]>r[j+1]) {
r[j]←→r[j+1];
exchange=j; //记录每一次发生记录交换的位置
}
}
}
再如,快速排序原本是不稳定的排序方法,但若待排序记录中只有一组具有相同关键码的记录,而选择的轴值恰好是这组相同关键码中的一个,此时的快速排序就是稳定的。
常见排序算法的稳定性叙述如下:
快速排序、希尔排序、堆排序不是稳定的排序算法,而选择排序、冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
另外:
1、如您所说如果资源有限(比如内存比较小),那么可以选择合适算法(如:堆排序算法),并且不用一次将所有数据都存储到内存。
2、如果CPU等资源允许的话,您还可以考虑使用多线程等的技术手段,来缩短运算时间。
建议采用基数排序,对于前1万以外的整数,插入时直接抛弃,最后排序时只对前n个基数范围进行排序,这样不但省内存而且排序效率也很高。
堆排序
原题并没有要求说要排序,只要找出前1万个即可
声明一万个元素的有序数组,在10亿数据中查找
如果当前数大于1W数组中的最小值,将其加入到1W的数组中,如果数组已满,将最小的值剔除
空间复杂度为 1W(10亿源数据不包含在内),时间复杂度为O(n)+O(n*1W*log(1W))=O(n)
O(n*1W*log(1W))来自于1W数组的排序(使用快速排序算法)