算法
文章平均质量分 61
Jo_huang
.....
展开
-
为什么归并排序比插入排序比较次数要少?
这两天看了几个排序算法,一直在思考一个问题,为什么归并排序就会比插入排序等初级排序算法的复杂度小呢?因为归并排序每次都把元素往正确的方向移动?还是有比较“记忆”,前面的比较优化了后面的比较?百思不得其解。后来用4个数进行模拟,有了一个猜想,只是猜想,并未验证。假如有ABCD 4个数的序列,要进行升序排序。对于插入排序,最坏的情况就是A>B>C>D,这样要比较次数为6次,排序过程如下原创 2015-11-24 11:26:03 · 1478 阅读 · 0 评论 -
二叉查找树(BST)的实现
二叉查找树是一种非常重要的结构,它解决了链表查找慢,数组插入慢的问题,将查找和插入都降低到 lgN数量级。本文主要参考了《算法(第4版)》里的思想,用C++进行实现。1.节点结构class treeNode{public : treeNode(int key, int val, treeNode* left, treeNode* right); treeNode(int key原创 2015-12-29 16:31:04 · 412 阅读 · 0 评论 -
优先队列和索引优先队
用堆二叉树实现,参考《算法》(第四版)。1.优先队列//二叉堆,从小到大排序class heapBinaryTree{public: heapBinaryTree(int capacity);//指定容量 heapBinaryTree(const int num[], int len);//用数组初始化堆 ~heapBinaryTree(); inline int getCa原创 2015-12-16 20:45:39 · 1146 阅读 · 0 评论 -
链表的快速排序
感觉链表的快速排序也挺好写的,甚至比数组更容易理解,但不知道为什么看到很多人都说快排不适合单链表结构的数据。思想:取第一个元素为哨兵,遍历链表,将小于、等于、大于的元素分成3个子链表;递归整理“小于”链表;递归整理“大于”链表;将3个链表连接起来。代码实现如下://链表快速排序,返回最后一个元素的地址myNode* quickSortForList(myNode* &he原创 2015-11-28 21:10:05 · 2003 阅读 · 0 评论 -
快速排序
使用最广泛的排序算法不需要借助辅助空间,平均复杂度只有NlgN,虽然最坏的情况下需要N平方,但是如果先对序列做随机化处理,出现最坏情况的几率非常小,可以不予考虑。大部分情况下比归并排序效率要高很多,而不需要额外空间。思想:1.随机取一个数,遍历序列,把小于该数的值放在左边,大于该数的放在右边;2.对该数的左边序列进行排序(递归)3.对该数的右边序列进行排序(递归)从上面原创 2015-11-26 19:14:18 · 340 阅读 · 0 评论 -
数组的归并排序
思想:不断二分长序列,直到子序列的长度为1(1个数本身是有序序列),将2个子序列合并,得到一个有序的父序列,继续合并,最终得到一个有序的原序列。实现代码:void mergeSort1(int num[], int start, int end)//自顶向下的归并排序{ //如果序列长度小于5则用插入法 if((end-start)<5) { insertSort(num,原创 2015-11-23 19:40:37 · 624 阅读 · 0 评论 -
链表的归并排序
一开始写链表的排序代码是因为在《算法》里面看到说自低向上的归并算法比较适合链表结构的数据,但是里面没有给出代码,于是就自己拿来练手。链表排序与数组排序最大的不同就是随机访问代价太高,每次都需要遍历。归并的思想就是把大的数据分成小数据,先将小数据排序,然后再并起来。而自低向上的归并,是一变二,二变四...最终变成一个整体(具体请参考算法书)对于链表来说,两个小链表的合并与两个数组的合原创 2015-11-22 20:07:38 · 387 阅读 · 0 评论 -
堆排序
思想:将数组调整为一个堆,保证父节点不小于两个子节点,这样根节点(堆顶)就是所有元素中的最大值。不断取出根节点并重新调整堆,直到堆被取完即可完成排序。技巧:1.关于“不断取出根节点形成有序数组”,可以将堆顶(最大值)与堆的最后一个节点交换,然后缩小堆(排除已取出的节点),然后下沉堆顶到正确的位置即可得到新的已调整的堆;2.构造堆有两种方式,一种是从堆顶往后遍历所有节点,每次都将当前节点原创 2015-12-10 18:49:28 · 365 阅读 · 0 评论 -
A*算法小结
这两天写cocos2dx寻路的时候刚好看到这个算法,一开始是看的这篇文章:A星寻路算法介绍写得已经是很通俗了,可是其中// if its already in the open listelse { // test if using the current G score make the aSquare F score lower, if yes update the原创 2015-11-14 20:57:14 · 474 阅读 · 0 评论 -
散列表(拉链式和线性探测)
无论是顺序查找还是二分查找(包括二叉树),查找或插入的时间复杂度总会与数据的总数N有关,而散列表可以将查找和插入操作降低到常数级别。最简单的一种常数级别的符号表,就是直接将数据的键值作为数组的索引,通过键值就可以立即访问到数据,时间复杂度为1.但是这种方法有一个缺点就是键值的分布并不是平均的,而且跨度可能会很大,这样就会导致数组中很多空间被浪费了。而散列表就是解决了这个缺点,将键值映射到均原创 2016-01-05 19:04:37 · 863 阅读 · 0 评论