文章分类 -  算法学习

摘要:前面学习的归并排序、快速排序、堆排序、shell排序、插入排序、选择排序、冒泡排序都是基于元素比较的排序算法。用决策树的方法可以得出它们最好的时间复杂度为O(nlgn)然而它们的适用场合比较多。计数排序以及桶排序、基数排序都不是基于比较的方法的,它们属于线性排序,也就是它们可以在线性时间内完成排序。但它们的条件要求相对比较法来说也是比较苛刻,计数排序就要求要指明排序的元素的是0~k之间的整数。当然了解了其运行方法后就可以将输入的任意数归一化到0~k范转围之内。线性时间排序效率提高是以空间的增加换取的。计数排序要与输入数组一样的内存空间,还要有长度为K的辅助数组以记录每一个元素出现的次数,这.. 阅读全文
posted @ 2012-09-23 16:41 answer0107 阅读(168) 评论(0) 推荐(0)
摘要:优先级队列操作一个初始为空的元素集合。提供两种基本操作,将一个数插入优先级队列和在优先级队列中取出一个优先级最高的数。在这里数字为正整数且小的有高的优先级。实现优先级队列固然可以用一个有序或无序的数组来实现。对于有序的情况来说,取出一个数的时间复杂度为O(1)而插入一个数为O(n);对于无序的情况来说,插入一个数为O(1),而取出一个数为O(n)。当进行n步对优先级队列操作时时间复杂度为O(n2)。这样的效率对于百万级的数据量来说是不可想像的。为了折衷可以找一种介于有序与无序之间的数据结构------小根堆。小根堆在整体内不保证有序,但保证与孩子节点之间是有序的,也就是都要小于孩子节点。而.. 阅读全文
posted @ 2012-09-23 16:37 answer0107 阅读(358) 评论(0) 推荐(0)
摘要:对于求一个数中集合的最大最小值问题可以在线性时间内解决问题,因为对于集合一次扫描就可以做出决定。而如何找出0~k中的第n大的数呢?可能对于大多数情况来说我们可以对集合进行排序,效率越高越好,再找出第n大的数。这样的时间消耗就是排序的时间消耗。为了在期望线性时间内做出选择,算法导论中给出了一种随机选择的算法,关于渐进时间为线性的证明书中有。它的思想主要是从随机快速排序算法而来,然而它每次只对快速排序划分的一边进行处理,有点类似二分法(二分快,但其必须是有序的哦)。过程是对集合进行随机的划分,而对于中枢值来说一次划分就可以找到其正确的位置,我们将中枢值所在位置与要找的n进行对比,如果小于中枢值的. 阅读全文
posted @ 2012-09-23 16:27 answer0107 阅读(119) 评论(0) 推荐(0)
摘要:当用一般的方法很容易想到将数字中的每一个数字与当前的最大值与最小值做出比较,最后得出最大最小值,这样每个元素都要与大小值比较两次,代价是一共比较四次。 事实上每个元素只要比较三次就可以,先把一组数字两两组织,先将两数字相互比较,其中大的与最大值相比较,小的与最小值相比较。这样只要比较三次了。 实现时要知道数字的总个数,如果为奇数就拿出一个初始化最大值与最小值,其余的两两组织;如果为偶数就拿出两个数来决定最大与最小值的初始值。 阅读全文
posted @ 2012-09-23 16:23 answer0107 阅读(110) 评论(0) 推荐(0)
摘要:堆排序时间复杂度为nlgn,因为其用到了堆这种数据结构,而大根堆构造的子操作(从下到上调整堆)复杂度lgn,所以大根堆构造为lgn复杂度,排序过程中要N(输入数据规模大小)次对建好的大根堆进行从顶调整,所以整体也就为nlgn。证明过程算法导论上有详细证明。 以下是整个堆排序C程序:extern int maxheapsize;/*************************************************Function: max_heapifyDescription: 将数组a中以pos为根的堆调整为大根堆,要保证以左右孩子为根的堆是大根的Input: Arg1... 阅读全文
posted @ 2012-09-23 16:18 answer0107 阅读(63) 评论(0) 推荐(0)
摘要:用借助于归并排序每次对分组的排序可以避免以N平方的扫描的时间复杂度,用分治的思想可以把这一过程的复杂度降为Onlgn+常数,常数为比归并排序多出来的时间 1 #include <string.h> 2 3 extern int* buffer; 4 5 int mergreversnumber(int* intarray, int startpos, int endpos) 6 { 7 int* startp = intarray + startpos; 8 int* secondp; 9 int size = endpos - startpo... 阅读全文
posted @ 2012-09-23 16:12 answer0107 阅读(202) 评论(0) 推荐(0)
摘要:1、快速排序 它基于分治的思想,将待排序的数组a[0...n-1]分为a[0...p-1],a[p+1...n-1]两部分,其中a[p]为中枢值,左边的值比它小,右边的值比它大。这样对左右两部分进行递归调用。快速排序的C代码: 1 void quicksort(int* intarray, int startpos, int endpos) 2 { 3 int* startp = intarray + startpos; 4 int* endp = intarray + endpos; 5 int len = endpos - startpos + 1; 6 ... 阅读全文
posted @ 2012-09-23 16:05 answer0107 阅读(101) 评论(0) 推荐(0)