- 博客(15)
- 资源 (5)
- 收藏
- 关注
原创 优化的冒泡排序
冒泡排序算法的运作如下:(从后往前) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 冒泡排序时间复杂度为: 最好:O(n) 最坏:O(n^2) 优化的冒泡排序
2016-08-08 11:23:43
282
原创 直接插入排序
直接插入排序(straight insertion sort)的做法是: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 时间复杂度为:O(n^2) 具体实现(c):i
2016-08-08 11:23:02
329
原创 希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 具体实现(c): 将直接插入排序的增量1改为其他数值,如:inc = inc/3+1;in
2016-08-08 11:22:27
221
转载 堆排序算法
9.7.2 堆排序算法 堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。如此反复执行,便能得到一个有序序列了。堆排序的时间复杂
2016-08-08 11:21:42
355
原创 归并排序
时间复杂度为:O(nlogn) 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。具体实现(c): 递归实现:include
2016-08-08 11:20:55
247
原创 快速排序
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 1) 程序开始执行,此时low=1,high=L.length=9。第4行,我们将L.r[low]=L.r[1]=50赋值给枢轴变量pivotkey,如图9-9-1所示。 2)
2016-08-08 11:19:37
368
原创 普里姆算法(Prim算法求最小生成树)
普里姆算法的基本思想:普里姆算法是一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。时间复杂度为O(n^2)。 从连通网络N = { V, E }中的某一顶点u0出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把该边加入到生成树的边集TE中,把它的顶
2016-08-05 18:59:23
6860
原创 克鲁斯卡尔(Kruskal)算法求图的最小生成树
克鲁斯卡尔(Kruskal)算法基本思想:(直接去找最小权值的边来构建生成树,构建时要考虑是否会形成环路) 先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,即把两棵树合成一棵树,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类
2016-08-05 18:59:06
3833
原创 迪杰斯特拉算法(求最短路径)
时间复杂度为:O(n^2) 最短路径:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径。具体算法及其详细讲解如下:
2016-08-05 18:58:47
751
原创 折半查找(二分查找)
时间复杂度为:O(logn) 原理:假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 具体实现: int bsearchWithou
2016-08-05 18:58:14
460
原创 插值查找
时间复杂度为:O(logn) 差值查找:根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法, 核心是公式 (key - a[low])/(a[high] - a[low]) 对于表长较大,而关键字分布比较均匀的查找表查找比折半查找好的多。 具体实现: int bsearchWithoutRecursion(intarray[],int low,int high,in
2016-08-05 18:57:51
421
原创 二叉排序树
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的结点。 二叉排序树的查找算法: /* 递归查找二叉排序树T中是否存在key, */ /* 指针f指向T的双亲,其初始调用值为NULL */
2016-08-05 18:57:05
459
原创 平衡二叉树
平衡二叉树的左右旋转 右旋转: void R_Rotate(BiTree *p) { BiTree L; L = (*p) ->lchild; (*p) -> lchild = L-> rchild; L -> rchild = (*p); *p = L; } 左旋转: void L_Rotate(BiTree *p) { BiT
2016-08-05 18:56:19
209
原创 C等语言各类运算符优先级
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
2016-08-01 08:35:25
475
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅