2014年4月6日

基数排序(RadixSort)

摘要: 1 基数排序的特点是研究多个关键字key,且多个key之间有权重之分, 或者可把单个key建模为含有多个key的排序 而计数排序、桶排序始终只有个一个key,或者说围绕着一个比较规则 Ex:比较年月日,先比较年份,如果相同,比较月份,如果还是相同,就比较日2 根据首先选择有效位的不同,分为两种 A.... 阅读全文

posted @ 2014-04-06 17:48 Seven++ 阅读(764) 评论(0) 推荐(0) 编辑

桶排序(BucketSort)

摘要: 1 桶排序核心思想是 根据数据规模n划分 m个相同大小的区间 (每个区间为一个桶,桶可理解为容器)2 每个桶存储区间内的元素(区间为半开区间 例如[0,10) 或者 [200,300) )3 将n个元素按照规定范围分布到各个桶中去4 对每个桶中的元素进行排序,排序方法可根据需要,选择快速排序,或者归并排序,或者插入排序5 依次从每个桶中取出元素,按顺序放入到最初的输出序列中(相当于把所有的桶中的元素合并到一起)6 桶可以通过数据结构链表实现7 基于一个前提,待排序的n个元素大小介于0~k 之间的整数 或者是(0, 1)的浮点数也可(算法导论8.4的例子)8 桶排序的时间代价,假设有m个桶,则每 阅读全文

posted @ 2014-04-06 01:13 Seven++ 阅读(1132) 评论(0) 推荐(0) 编辑

2014年4月2日

计数排序

摘要: 1 计数排序不基于元素之间的比较2 计数排序假设n个输入元素中的每一个元素介于0 到 K 之间的整数3 计数排序的基本思想是,对于每一个元素x,从n个元素中统计出小于x的个数 EX:如果有17个元素小于x, 那么x的位置可确定为第18个位置(对于几个元素相同时,需要对方法做略微修改)4 计数排序通常的实现方式 a. 找出n个元素中最大值key,确定一个辅助数组,数组大小为key+1 (+1 考虑了元素0) b. 统计每个元素的个数(0 一直到 key) c. 统计每个元素x在n个元素中,小于或等于x的个数,累加x元素之前的每个元素个数 EX:假设为x=2,n个元素中有两个0、三... 阅读全文

posted @ 2014-04-02 23:13 Seven++ 阅读(1508) 评论(0) 推荐(0) 编辑

2014年3月30日

快速排序

摘要: 1 快速排序同合并排序一样 ,采取的是分治策略2 合并排序是先分解,合并时处理排序;快速排序是分解之前进行区域划分处理排序(原地排序)3 快速排序的运行时间 与 划分数据时 是否对称相关(两个区域的数据数量是否对称)4 划分过程需要选取key,通过与key比较划分成两个区域5 最坏情况出现在两个区域划分分别为 n-1 个元素 和 0个元素 最好情况出现在两个区域划分分别为 n/2 和 n/2 - 16 快速排序最坏情况运行时间比较差n的平方,但其平均性能相当好nlgn(通常比合并排序快3倍以上)7 为达到平均性能且不依赖特定的输入,数据划分的key 需要采取 随机化取样的技术获取 1 #inc 阅读全文

posted @ 2014-03-30 15:04 Seven++ 阅读(267) 评论(0) 推荐(0) 编辑

2014年3月27日

6.5 k个已排好序链表合并为一个排序链表

摘要: 1 建立链表(带哨兵位的)2 建立最小堆方法3 合并已排好序的k个链表 1 typedef int DataType; 2 //建立链表 3 class Link 4 { 5 private: 6 struct Node 7 { 8 DataType data; 9 Node *next; 10 }; 11 Node *head; //哨兵位 12 public: 13 Link() 14 { 15 Init(); 16 } 17 ~Link() 18 { ... 阅读全文

posted @ 2014-03-27 00:13 Seven++ 阅读(281) 评论(0) 推荐(0) 编辑

2014年3月26日

优先队列 (堆实现)

摘要: 共两部分 C 实现 & C++类的编写-------------------------------------C实现------------------------------------------1 通过堆的性质 编写优先队列2 堆中的元素可根据实际需要 存储相应的值(可以是指针,结构体 或者 是一个对象), 此处简单起见使用了整数 1 //保持最大堆性质 参数inode为内部结点 注意结点从1开始,数组从0开始 2 void MaxHeapify(int array[], int size, int inode) 3 { 4 int largest= inode; ... 阅读全文

posted @ 2014-03-26 00:10 Seven++ 阅读(379) 评论(0) 推荐(0) 编辑

2014年3月25日

堆排序 C++

摘要: 1 堆排序拥有插入排序的优点 (是一种原地排序算法只需要存储常数个元素在输入数组以外 即省空间), 同时拥有合并排序算法的复杂度 nlgn,逼格有点高2 堆数据结构 是一个数组对象,可以被视为一颗完全二叉树,树中的每个结点的值 与 数组中存放的值 对应(看图) 完全二叉树,树中每一层都是满的,除最后一层,即叶子结点只可能存在于(假如深度为n) 最后一层n和n-1 层,且最后一层严格按照最左边的子树开始填) a 左边为一颗完全二叉树,右边为一个数组 b 圆圈中的数字表示树中每个结点存储的值 c 结点上方的数字 表示对应的数组下标 d 数组上下连线表示父子关系,且父... 阅读全文

posted @ 2014-03-25 00:16 Seven++ 阅读(460) 评论(0) 推荐(0) 编辑

2014年3月20日

合并排序(归并排序)

摘要: 1 合并排序采用的是 分治策略 a 分解:将原问题分解成一系列子问题 b 解决:递归的解决各个子问题,若问题足够小,则直接求解 c 合并:将子问题的结果合并成原问题的解2 将n个元素分成 各含n/2个元素的子序列(重复执行分解动作,直到子程序元素足够小)3 单个元素被视为 已排好序的4 为做合并 需要引入辅助操作5 合并算法的算法复杂度为 nlgn(低为2)注意:实现时需要考虑起始下标为 0 或者 为 1 的情况, 两种方法均可实现(原理相同),但下标的不同直接导致分解方式的不同, 遇到问题时可在关键位置加入 '打印关键值'来调试程序void Merge(int array[] 阅读全文

posted @ 2014-03-20 23:25 Seven++ 阅读(1241) 评论(0) 推荐(0) 编辑

2014年3月18日

插入排序

摘要: 1 插入排序使用的方法是增量方法, 首先将已有的数据排好,(玩扑克的时候等待拿牌) 然后插入新数据,进行排序, (将拿到的牌插入到正确的位置里) 最后再次形成排好的数据 等待新数据的插入 (再次等待下一轮拿牌)2 插入排序的算法复杂度为 n的平方3 插入排序属于原地排序算法,在排序数组时只有常数个元素存放到数组以外的空间去 1 void InsertSort(int array[], int size) 2 { 3 for (int i=1; i=0 && array[j]>key) //当前最大值 大于 新插入的数据(key)的时候 9 { ... 阅读全文

posted @ 2014-03-18 23:10 Seven++ 阅读(325) 评论(0) 推荐(1) 编辑

导航