摘要: gcc 提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常可以使用-Wall来开启以下警告: -Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts -Wimplicit-int -Wi... 阅读全文
posted @ 2014-07-13 15:36 surgewong 阅读(303) 评论(0) 推荐(0) 编辑
摘要: K-均值算法的基本思想是首先从含有N个数据对象的数据集中随机选择K个数据对象作为初始中心,然后计算每个数据对象到各中心的距离,根据最近邻原则,所有数据对象将会被划分到离它最近的那个中心所代表的簇中,接着分别计算新生成的各个簇中数据对象的均值作为各簇新的中心,比较新的中心和上一次得到的中心,如果... 阅读全文
posted @ 2014-04-15 16:06 surgewong 阅读(5306) 评论(0) 推荐(0) 编辑
摘要: 基数排序(Radix Sorting),又称 桶排序(bucket sorting)是之前的各类排序方法完全不同的一中排序方法,在之前的排序方法中,主要是通过元素之间的比较和移动两种操作来实现排序的。基数排序不需要进行元素之间的比较,而是根据关键字的每个位上的有效数字的值,借助“分配”和 “收集”两种操作来进行排序的一中内部排序方法。 在具体介绍基数排序算法前,首先先介绍两个两个关键词:单关键字和多关键字。序列中任一记录的关键字均有 d 个分量 ki0ki1 …… kid-1 构成,若 d 个分量中每个分量都是一个独立的关键字,则文件是多关键字的(如扑克牌有两个关键字:点数和花色、汉子的... 阅读全文
posted @ 2013-10-22 12:02 surgewong 阅读(3329) 评论(0) 推荐(0) 编辑
摘要: 归并排序(这里主要介绍二路归并)的基本思想是:将排序文件看成为 n 个长度为 1 的有序子文件,把这次子文件两两归并(二路归并),使得到 [n/2] 个长度为 2 的 有序子文件; 然后再把这[n/2] 个有序文件的子文件两两归并,如此反复,直到最后得到一个长度为 n的有序文件为止, 这种排序方法称为二路归并排序。 通过一个案例来说明其具体流程, 假设序列 为 : 125 11 22 34 15 44 76 66 100 8 14 20 2 5 1 共 15 个元素 初始状态: [125] [11] [22] [34] [15] [44] [76] [66] [100] [8] ... 阅读全文
posted @ 2013-10-21 22:25 surgewong 阅读(848) 评论(0) 推荐(0) 编辑
摘要: 快速排序的基本思想是,通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。 详细描述:首先在要排序的序列 a 中选取一个中轴值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于 中轴值,右边的部分 c 的元素 均大于或者等于中轴值,而后通过递归调用快速排序的过程分别对两个部分进行排序,最后将两部分产生的结果合并即可得到最后的排序序列。 “基准值”的选择有很多种方法。最简单的... 阅读全文
posted @ 2013-10-21 21:45 surgewong 阅读(93355) 评论(0) 推荐(7) 编辑
摘要: 冒泡排序就是将待排序的元素看作是排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒牌排序算法中需要对这个“气泡”序列处理若干遍,所谓的一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻元素的顺序是否正确。如果发现两个相邻元素逆序,即“轻”的元素在下面,就交换它们的位置。现在处理一遍后,“最轻”的元素就浮到了最高的位置;处理第二遍的时候,“次轻”的元素就浮到了次高的位置。在做作第二遍的时候,由于最高元素已经是“最轻”的元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位以上的元素,因为经过前面i -1 遍的处理,它们已经是正确地排好序。 冒泡排序相对比较简单,只介绍第一遍的... 阅读全文
posted @ 2013-10-21 19:59 surgewong 阅读(609) 评论(0) 推荐(1) 编辑
摘要: 堆排序是另一种基于选择的排序方法。它是一种树形选择排序,利用了堆顶记录的关键字最大(或最小)这一特征,使得当前无序去中选取最大或(最小)关键字变得简单。 堆的定义:有n个元素组成的序列{k0,k1, k2, k3, ……, kn-2, kn-1},当且仅当满足关系: ki = k2i+1 且 ki >= k2i+2)其中i = 0,1,2,……,[(n/2]-1时,称之为堆。 例如序列{47, 35, 27, 26, 18, 7, 13, 19} 就满足上面的条件,这个序列就是一个堆。 若将堆看成是一棵以k0为根的完全二叉树,则,这棵完全二叉树的每个非终结点的值均不大于(或小于)其左、. 阅读全文
posted @ 2013-10-21 19:18 surgewong 阅读(693) 评论(0) 推荐(0) 编辑
摘要: 选择排序的基本思想:每次从待排序的记录中选出关键字最小(或最大的)记录,顺序存放已经排序的记录序列的后面(或前面),直到全部排完。 同插入排序一样,分为有序段和无序段,不同的的是选择排序是从没有排好序段中找出最小(或最大)的元素添加在有序序列段后后面,这样子有序序列段不断边长,直至所有的序列均排好序。 实例分析:(红色表示已经有序段,黑色表示无序段,绿色表示刚被替换的元素) 初始状态: 70 30 40 10 80 20 90 100 75 60 45 共11个元素 第一次:10 30 40 70 80 20 90 100 75 60 45刚开始所有的序列均认为是无序的,... 阅读全文
posted @ 2013-10-21 12:24 surgewong 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 希尔排序是对直接排序插入排序算法的改进,又称为缩小增量排序。其基本思想是将待排序的记录分成几组,每组中元素都比原来的序列少,从而减少参与直接插入排序的数据量,在各组中分别进行直接插入排序。经过几次分组排序后,记录的排列已经基本有序,这个时候在对所有的记录实施直接排序。 具体步骤描述如下:假设待排序的记录为n个,先取整数 d#define MAX_NUM 80void shellsort(int* a, int n){ for(int d = n/2; d >= 1; d = d/2) { int guard = -1; for (int i = 0... 阅读全文
posted @ 2013-10-21 11:13 surgewong 阅读(730) 评论(0) 推荐(0) 编辑
摘要: 插入排序的主要思路是不断地将待排序的数值插入到有序段中,使有序段逐渐扩大,直至所有的数值都进入有序段中。 根据待排序的数值插入到有序段中的顺序,可以归纳为两类:直接插入排序和折半查找插入排序。 直接插入排序的基本思想是依次将记录序列中的每一个记录插入到有序段中,使有序段的长度不断地扩大。 现在以一个实例简单的说明一下这个算法的原理,假设数据存在数组a[]中,排序后的结果为升序: 初始状态: 45 37 61 87 66 23 29 45 45 37 61 87 66 23 29 45 (第一个元素认为已经排好序) 第一次:3745... 阅读全文
posted @ 2013-10-20 23:38 surgewong 阅读(541) 评论(0) 推荐(0) 编辑