
数据结构&算法
文章平均质量分 78
yuanwenqun2
一桶糨糊
展开
-
位图排序原理及C语言实现(源于《编程珠玑》)
<br />在《编程珠玑》的第一章,就是相当的精彩,这个位图排序就是出自那里。书中讲到的位图排序非常的巧妙(时间和空间都时非常的节省),而这巧妙是来源于对实际问题和数据的透彻分析,然后选取了一种高效的解决方案。结合网上的一些资料以及自己的程序实现来简单记录一下吧。<br />1.位图的理解<br />我们都明白图形格式中位图储存方式,其实就是以象素为单位的小方块,一格一格的纵横累积起来. 每一个小方块代表一种颜色,当然,如果对于黑白的二色图来说更加简单,只需要一个bit位即可表示. 这和我们转载 2011-05-30 22:19:00 · 2586 阅读 · 1 评论 -
辗转相除法
<br />辗转相除法是用于求两个数的最大公约数的方法。<br /> 首先解释下什么是最大公约数(相信很多人都清楚了):若整数a能被整数k(k≠0)整除,则称k为a的约数。如果k既是a的约数,又是b的约数,则k称为a和b的公约数。a和b可以有多个公约数,其中最大的一个公约数称为最大公约数。<br /> <br />辗转相除法的步骤是:<br />(1) 用两个数中的大数除以小数,得到余数。<br /> (2) 以(1)中的小数替换(1)中的大数,以(1)中的余数替换(1原创 2011-05-01 17:09:00 · 695 阅读 · 0 评论 -
经典算法之汉诺塔
<br />典故:<br /> 据说创世纪时有一座波罗教塔,是由三支钻石棒所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘,并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当 盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。<br /><br /> <br />解法:<br /> 这是一个经典的递归算法。把三根柱子标记为A、B、C,问题即为把n块金盘由A搬到C,搬运过程中遵守大盘子在小盘子之下的原原创 2011-05-01 17:07:00 · 1429 阅读 · 0 评论 -
经典算法之冒泡排序
<br />问题<br /> 有一数组a,长度为n,把数组中的元素从小到大重新排列<br /><br />思路<br /> 从0到n-1,两两比较数组中的元素,如果前者大于后者,则交换之(如a[0]>a[1],则交换a[0]和a[1])。作一趟冒泡排序后,最大值就在最后一个位置a[n-1]上了。然后对余下的0到n-2个元素作第二趟冒泡排序,次最大值就去到倒数第二个位置a[n-2]上了,如此类推。<br /> 例如对10,-3,5,34,-34,5,0,9进行排序<br />第一趟:-原创 2011-05-01 17:05:00 · 606 阅读 · 0 评论 -
经典算法之选择排序
<br />问题<br /> 有一数组a,长度为n,把数组中的元素从大到小重新排列<br /> <br />思路<br /> 选择排序十分容易理解。可以理解为有一个盘子,里面装着很多钻石,你可以从里面拿钻石,但一次只可以拿一颗。第一次你当然会拿最大的出来了,第二次你将拿剩下的钻石中最大的。<br /> 第一趟从0到n-1中找到最大的元素,假设为a[max],把a[max]与a[0]交换,这时a[0]是最大的了。第二趟从1到n-1中找到最大的元素(a[0]已经是有序的了,原创 2011-05-01 17:03:00 · 471 阅读 · 0 评论 -
经典算法之插入排序
<br />问题<br /> 有一数组a,长度为n,把数组中的元素小到大重新排列。<br /> <br />思路<br /> 我们把数组分为已排序和未排序两部分,把未排序的元素一次一个插入到已排序部分的合适位置上。已排序部分逐渐增大,直到整个数组变成有序的。<br /> 一趟排序:假设从第n个元素开始是无序的,而其前面n-1个元素是有序的。把a[n]取出来放入temp中。然后用temp与前面的元素比较。(1)如果比前面的元素小,则前面的元素后移一位;(2)如果比前面的元素原创 2011-05-01 17:01:00 · 412 阅读 · 0 评论 -
经典算法之二分查找法
<br />问题:<br /> 如果一个数列已排序(从小到大),查找指定元素在其中的位置。<br /> <br />解法:<br /> 利用数列已排序的特性,从数列的中间开始搜寻,如果这个数小于所搜寻的数,则该数左边的数<br />一定都小于要搜寻的对象,所以无需浪费时间在左边的数;如果搜寻的数大于所搜寻的对象,则右边的<br />数无需再搜寻,直接搜寻左边的数。如此类推,直到找到该元素,如果找不到则返回-1。<br /> <br /> 例如从数列-4, -2, 4, 6, 9, 14,原创 2011-05-01 17:00:00 · 514 阅读 · 0 评论 -
经典算法之希尔排序
<br />问题<br /> 有一数组,长度为n,把数组中的元素从小到大重新排列。<br /> <br />思路<br /> 希尔排序把n个元素按一定的间隔分成几组,然后按组为单位进行插入排序。<br /> 先将间隔设定为n/2,然后对每组进行插入排序,再来将间隔n/4,对每组进行插入<br />排序,再来将间隔设定为n/8、n/16,直到间隔为1,进行最后一次排序。<br /> 例如对10,-3,5,34,-34,5,0,9进行排序。<br /> 初始间隔为原创 2011-05-01 16:58:00 · 525 阅读 · 0 评论 -
经典算法之鸡尾酒排序
<br />问题<br /> 有一数组,长度为n,把数组中的元素从小到大重新排列。 <br /> <br />说明<br /> 鸡尾酒(cocktail)排序,又叫搅拌(shaker)排序。是改良的冒泡排序,冒泡排 <br />序可见本人的另一篇文章经典算法之冒泡排序。 <br /> <br /><br />思路<br /> 鸡尾酒排序的过程为:(1)先对数组从左到右进行冒泡排序(升序),则最大的元 <br />素去到最右端;(2)再对数组从右到左进原创 2011-05-01 16:56:00 · 561 阅读 · 0 评论 -
经典算法之快速排序
<br />说明:<br /> 快速排序是目前公认最快的排序方法之一。大部分情况都表现得很好,但当必须考虑最坏情况时,快速排序不可接受,因为时间达到O(n2)。<br /> <br />思路:<br /> 快速排序的基本思想是在数列中找出适当的轴心,将数列分成左右两部分(左半部分的元素都小于右半部分的元素),然后分别对两部分进行排序(重覆选择轴心,划分左右部分的过程)。<br /> 以中间元素为轴(用p表示)进行处理的步骤:<br /> 1、 令索引i从左向右找,直到转载 2011-05-01 16:52:00 · 580 阅读 · 0 评论 -
内部排序算法的比较和实现
排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行时间中占有很大比重;并且排序本身对推动算法分析的发展也起很大作用。目前已有上百种排序方法,但尚未有一个最理想的尽如人意的方法,本文介绍常用的如下排序方法的C/C++实现,并对它们进行分析和比较。更详细的算法思想的介绍可以参考这里 /* 冒泡排序 插入排序 二路插入排序 希尔转载 2012-02-14 21:47:02 · 824 阅读 · 0 评论