
数据结构与算法
文章平均质量分 60
xxxspade
Always Coding
展开
-
计数排序
基本介绍当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 好处 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量内存。计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计原创 2017-02-28 13:14:42 · 239 阅读 · 0 评论 -
二叉树遍历非递归实现
二叉树的遍历关于二叉树遍历,先序,中序,后序其实都是很简单了。 二叉树一般定义:public class Node{ public int value; public Node left; public Node right; public Node(int val){ this.val=val; } }递归实现先序遍历public void原创 2017-03-13 02:06:28 · 304 阅读 · 0 评论 -
选择排序
核心思想选择排序 ,也是将数组分成两部分,前面部分是有序的,后面部分每趟排序,从i到N-1的部分中 选择出一个最小的元素,然后交换到前面部分的后面。 第一趟排序比较长度是N,因为从N个元素中找出最小的,第二次就是N-1了,….依次递减比较的长度。 所以经过了这几趟排序就可以把数组排序好。 我们选择排序其实就是选择无序中的最小,然后与有序序列的后一个元素交换!思考步骤1.首先要有一个比较基准也原创 2017-03-12 16:29:52 · 455 阅读 · 0 评论 -
插入排序
核心思想插入排序是一种通过移动整个数组来交换元素的算法 假设有N个元素,那么它由N-1趟排序组成。 它基于这样的事实: 它将数组分成两个部分,第0~ P-1 个元素是有序的,第P到N-1是无序的。 每一趟排序,我们选择第P个位置的元素,即右边部分取出一个数放到0-~P-1中的一个正确位置。 我们比较这个元素和第0~P-1的元素,在一个循环中一个一个比较,比它大的就后移,遇到比它小的就跳出循原创 2017-03-12 15:45:43 · 359 阅读 · 0 评论 -
快速排序
快速排序核心思想核心:在于选主元pivot和partition过程 以及 二分的思想。一般的快速排序是选取第一个元素作为主元,然后通过一趟排序将要排序的数据进行分组,比主元小的分到左边,比主元大的分到右边。 然后再分别对左边和右边的部分进行递归。快速排序三个步骤 选择基准:在待排序列中,按照某种方式挑出一个元素,作为pivot 划分操作:将数组中比主元小的交换到左边,比主元大的交换到右边 递归对两原创 2017-03-02 16:34:34 · 377 阅读 · 0 评论 -
重建二叉树
对于一颗二叉树来说,有了前序和中序或者中序和后序就可以确定这颗二叉树,我们就可以重建它了。 一般先考虑前序的序列,它的第一个数就是这个二叉树的根节点,然后我们遍历中序序列,找到这个根节点后;在它左边的序列就构成了根节点的左子树,右边的序列就构成了根节点的右子树。 下面的事情就好办了,我们只需要递归左边的序列和右边序列,注意我们还是需要回到前序序列来确定左边序列的根节点和右边序列的根节点。这样才能原创 2017-03-09 00:49:12 · 303 阅读 · 0 评论 -
判断一个链表是否为回文结构
题目:给定一个链表的头结点head,判断该链表是否为回文结构例如: 1->2->1 ,true 1->2->2->1, true 1->2->3, false使用栈来解决最直接的想法应该就是利用栈来解决这个问题了。 判断回文结构的最核心思想: 从左到右读的顺序和从右到左读的顺序是一样的,这实际上暗示了使用栈,因为如果压栈序列和出栈序列是一样的,那么这就肯定是一个回文结构了! //此处定义原创 2017-03-08 02:37:46 · 418 阅读 · 0 评论 -
堆排序
先说说堆堆分为大根堆和小根堆,都是完全二叉树。 大根堆:要求每个节点不大于其父节点 小根堆 : 要求每个节点不小于其父节点复习一下完全二叉树: 除了最后一层外,其他各层都达到该层节点的最大数,最后一层如果不满,该层所有节点都全部靠左排 一颗二叉树,深度为k,对这棵树编号,如果所有的编号都和满二叉树的编号对应,则这棵树是完全二叉树 堆排序思想堆排序的话,最重要还是建立堆,然后调整堆,使得堆满足大根原创 2017-03-01 23:43:22 · 491 阅读 · 0 评论 -
基数排序
基本思想 将待排数据中的每组关键字依次进行桶分配。 具体示例: 278、109、063、930、589、184、505、269、008、083 我们将每个数值的个位,十位,百位分成三个关键字: 278 -> k1(个位)=8,k2(十位)=7,k3=(百位)=2。 然后从最低位个位开始(LSD),对所有数据的k1关键字进行桶分配(因为,每个数字都是 0-9的,因此桶大小为10),再依原创 2017-02-28 23:56:44 · 435 阅读 · 0 评论 -
桶排序
桶排序Bucket Sort桶排序是计数排序的一个变种,同样也是非常快的时间复杂度,计数排序最快是O(N),它不是比较类型的算法。时间复杂度为O(N+M)。而桶排序则看下面:(最好的情况能到O(N))。思路/做法把计数排序中相邻的m个“小桶”放到一个”大桶”中,在分完桶后,对每个桶进行排序(一般用快排),然后合并最后的结果基本思想一组长度为N的待排关键字序列K[1…n]。 首先将这个序列划分为M个子原创 2017-02-28 14:41:17 · 465 阅读 · 0 评论 -
归并排序(Java&&JavaScript)
分析归并排序就是两步,第一步是递归左右两部分,第二部就是合并两个已排序的数组(表)。 两个数组已经是有序的了,那么算法可以通过一趟排序来完成。核心思想合并就是合并两个数组,很简单,我们只需要使用3个指针,一个是指向第一个有序数组,另一个是有序数组,还有一个指向新的数组。 不断比较两个数组中,取出较小的一个然后存到新数组中,如果其中一个数组已经全部被复制到新数组了, 那么就把剩下的直接复制到新数原创 2017-03-14 13:38:44 · 359 阅读 · 0 评论