摘要:
排序算法之合并排序 一、递归的合并排序 思想:合并排序(merge sort)又称归并排序,要点是反复将两个长度较短的有序段,合并成一个有序段,直到数组中只含一个有序段。 递归的合并排序算法: void merge_sort(s) { if(s的长度不大于1) return; 把s分成长度相等的两段 阅读全文
摘要:
排序算法之堆排序 堆的定义:堆是每个非叶结点值都大于或等于其儿子值(父大于子)的完全二叉树。 用数组a[n+1]存储长度为n的堆(a[0]不用) a[i]≥a[2*i] a[i]≥a[2*i+1] 根结点a[1]存储的是最大值(大根堆) 可以自定义小根堆 示例 排序阶段的操作方法: 步骤1)令j=n 阅读全文
摘要:
排序算法之选择排序 原理:从n个元素中选出一个最大元素,调到序列末端再从剩下的n-1个元素中选出最大元素……,反复如此,可完成排序。 简单选择算法: for(k=n-1;k>0;k - -) { i=0; for(j=1;j<=k;j++) if(a[j]>a[i]) i=j; //选最大元 交换a 阅读全文
摘要:
排序算法之快速排序 基本原理——反复进行有序划分。 有序划分方法 在数组a中任选一个元素x作为划分元素,通过比较将小于x的元素换到数组的左端(左段), 将大于或等于x的元素换到数组右端(右段),x本身位于两段之间。如果左、右段元素个数多于1,则递归的将左、右段各自划分,直到每段元素个数都不超过1,从 阅读全文
摘要:
排序算法之冒泡排序 原理:反复扫描数组a,比较相邻元素a[i]与a[i+1]。 若逆序(a[i]>a[i+1])就交换 自上而下地扫描的下降法 最大元素下降到底部 自下而上地扫描的上升法 最小元素上升到数组顶部 上升法图例: 简单的冒泡排序算法(上升法) void bubble_sort(int a 阅读全文
摘要:
排序算法之希尔排序 基本原理: Donald.L.Shell设计的排序算法。 特点: (1)缩小增量 (2)多遍插入排序 例如,选用增量序列(9,5,3,1) 4个增量,进行4遍插入排序 。 术语: h-排序(h-sorted) h-子序列(h-subsequence) h-有序的(h-ordere 阅读全文
摘要:
排序算法 排序的含义:排序(sorting),又称分类。是将无序序列变换成有序序列的一种运算。如果参加排序的数据结点含多个域,那么,排序往往是针对其中某个域而言的。 排序方法的分类: 按数据存储介质:内部排序和外部排序 按比较器个数:串行排序和并行排序 按主要操作:比较排序和基数排序 按辅助空间多少 阅读全文
摘要:
图结构的类实现示例 说明:以无向图为例,给出图类、先深搜索和拓扑排序的类实现 1.邻接表存储的图类 (1)有关类型定义 typedef char Vname_type; //顶点名类型,假定字符型 typedef int Vdata_type; //顶点所带信息类型,假定整型 typedef flo 阅读全文
摘要:
拓扑排序 概念:将有向图G的顶点排成一个序列,使得,如果v到w有路,则v排在w之前(注意,并非v排在w之前,v到w就一定有路),拓扑排序所得的顶点序列是图的拓扑序列。 算法描述 步骤1)当图中存在入度为0顶点时,循环: ①任选一个入度为0的顶点v,输出v ②删去v,以及v射出的边 步骤2)循环终止时 阅读全文
摘要:
Floyd算法 思想:将n个顶点的图G“分成”很多子图 每对顶点vi和vj对应子图Gij(i=0,1,…,n-1和j=0,1,…,n-1) 每对顶点vi和vj都保留一条顶点限于子图Gij中的最短路径Pij(称为待定路径),其长度为Dij,不断地往子图Gij中增加“中间过渡点”(子图不断扩大),不断地 阅读全文