随笔分类 -  数据结构与算法分析

SUANFA,YEAP!
字符串排序(非字典排序)
摘要:2015.3.11今天阿里面试,最后给我出了一个算法题,如下: 一个数组字符串,对其中的字符串进行排序,排序规则如下:长度越小越排在前面,长度相同则按照字符串大小排序。举个例子:“a”,"ab","Ab","b","abc",排序后 : a, b, Ab, ab, abc。 和室友讨论一下,由他... 阅读全文
posted @ 2015-03-11 23:04 水目沾 阅读(720) 评论(6) 推荐(0)
效率更高的整数转化为字符串函数
摘要:整数转化为字符串的函数相信大家在做一些算法题的时候就已经做过,一般能想到的代码如下: 1 size_t my_uint32_to_str(uint32_t value, char *dst) 2 { 3 size_t length = digits10(value); 4 siz... 阅读全文
posted @ 2015-01-29 02:03 水目沾 阅读(1076) 评论(1) 推荐(0)
各种排序算法的总结和比较(转)
摘要:各种排序算法的总结和比较1 快速排序(QuickSort)快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。(1)如果不多于1个数据,直接返回。(2)一般选择序列最左边的值作为支点数据。(3)将序列分成2部分,一部分都大于支点数据,... 阅读全文
posted @ 2014-04-21 15:31 水目沾 阅读(406) 评论(0) 推荐(0)
数据结构树之红黑树
摘要:红黑树简介: 红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED 或 BLACK。通过对任何一条根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径回避其他路径长处2倍,因而是近似平衡的。 树的每个结点包含 5 个属性:color,key,left,right和p。如果一个结点没有子结点或者父结点,则该结点相应的指针属性的值为NULL。我们可以把这些NULL视为指向二叉搜索树叶结点的指针,而把带关键字的结点视为树的内部结点。红黑树的性质: 一棵红黑树是满足下面红黑性质的二叉搜索树: 1.每个结点或是红色的,或是黑色的 2.根节点是黑色的... 阅读全文
posted @ 2014-04-04 10:27 水目沾 阅读(8661) 评论(0) 推荐(0)
排序算法之选择排序
摘要:选择排序算法简介: 选择排序是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。选择排序算法复杂度分析: 选择排序的交换操作介于0和(n - 1)次之间... 阅读全文
posted @ 2014-03-31 15:08 水目沾 阅读(368) 评论(0) 推荐(0)
数据结构树之二分查找树
摘要:二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点(no duplicate nodes)。二叉查找树的性质: 二叉查找树本质上是一种二叉树,所以上章讲的二叉树的性质他都有。二叉查找树的思想: 二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二.. 阅读全文
posted @ 2014-03-30 23:45 水目沾 阅读(2395) 评论(0) 推荐(0)
数据结构树之二叉树
摘要:二叉树的定义: 是一颗空树或者具有以下性质 1.结点最多只有两个孩子,且有左右之分。不能交换左右孩子 2.结点点的左子树和右子树也是二叉树。例图 二叉树的基本形态:二叉树中的术语: 1).结点度:节点所拥有的字数的个数成为该节点的度,在二叉树中度的取值只能是0,1,2. 2).叶节点:度为0的节点成为叶结点或终端结点。 3).左孩子、右孩子、双亲:树中一个结点的子树的根结点称为这个结点的孩子。这个结点称为它孩子结点的双亲。具有同一个双亲的孩子结点互称为兄弟。 4).路径、路径长度:如果一棵树的一串结点n1,n2,…,nk有如下关系:结点ni是ni+1的父结点(1≤i... 阅读全文
posted @ 2014-03-30 16:03 水目沾 阅读(618) 评论(0) 推荐(0)
排序算法之希尔排序
摘要:希尔排序算法简介: 希尔排序属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序。 排序过程:先取一个正整数d1 2 3 using namespace std; 4 5 //希尔排序 6 void shellSort(int iarr[],int length) 7 { 8 int dt[3] = {5,3,1},i =0 ,j,k,temp; 9 for(j = 0; j = 0)16 {17 iarr[k + dt[j]] = iarr[k];18 k -= dt... 阅读全文
posted @ 2014-03-29 11:04 水目沾 阅读(1794) 评论(0) 推荐(0)
排序算法之插入排序
摘要:插入排序算法简介: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置插入排序算法思想: 一般来说,插入排序都采用in-place在数... 阅读全文
posted @ 2014-03-28 22:50 水目沾 阅读(319) 评论(0) 推荐(0)
排序算法值快速排序
摘要:快速排序算法: 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序思想: 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面, 这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就... 阅读全文
posted @ 2014-03-28 11:26 水目沾 阅读(329) 评论(1) 推荐(0)
排序算法之堆排序
摘要:前言:今天我来介绍下堆排序,在写堆排序代码之前,我们要知道堆的概念! 堆的定义:n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki=号。//k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 堆的分类: 1).大根堆和小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆... 阅读全文
posted @ 2014-03-28 10:02 水目沾 阅读(606) 评论(1) 推荐(0)
排序算法之归并排序
摘要:归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。比较 归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序.. 阅读全文
posted @ 2014-03-28 00:47 水目沾 阅读(281) 评论(0) 推荐(0)
排序算法之冒泡排序
摘要:参考:http://baike.baidu.com/view/254413.htm算法原理 冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值。 所以,冒泡排序最好的时间复杂度为O(n)。 若初始文件是反序的,需要进行n2趟排... 阅读全文
posted @ 2014-03-27 20:53 水目沾 阅读(470) 评论(0) 推荐(0)