算法
yuanopen
这个作者很懒,什么都没留下…
展开
-
蓝桥杯-历届试题-蚂蚁感冒
题目:长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。 这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。 输入:第一行输入一个整数n (1 接着原创 2018-02-01 23:56:19 · 158 阅读 · 0 评论 -
快速排序
概要:快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。方法:对于下列数组arr:选一个中间量:int v=arr[1]=4...原创 2018-03-03 10:13:22 · 308 阅读 · 0 评论 -
快速排序优化(一)
和归并排序做对比:归并排序时间复杂度:快速排序时间复杂度:快速排序最差时间复杂度:解决方法:随机化快排快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个元素作为主元。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。...原创 2018-03-03 10:57:30 · 362 阅读 · 0 评论 -
快速排序优化(三路快排)
问题: 在快速排序这篇中,通过代码可以发现,程序只是对<v的值进行操作,而对于>=v,不做操作,那么问题来了,对于一个数组中如有很多=v的值,在进行递归排序中还会去操作这些值,这无疑是降低了算法的效率。解决方法: 三路排序算法假设:e为当前要考察的值1::e<v时:将e的位置的值与=v第一个位置的值交换:之后整个数组如下:e继续考察下一个:2:e>v时:将e的位置的值与&g...原创 2018-03-03 12:47:11 · 3068 阅读 · 3 评论 -
堆排序
一,什么是堆堆:(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象,堆总是满足下列性质:1,堆中某个节点的值总是不大于或不小于其父节点的值;2,堆总是一棵完全二叉树。3,将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。如下图为最大堆:注意:最后一层没有饱和,但是节点必须从左边开始排起,这样才能满足最大堆。...原创 2018-03-03 20:46:03 · 271 阅读 · 0 评论 -
堆排序优化
此篇是在上一篇文章堆排序进行展开讨论的。一,概要在上一遍中,在向一个完全二叉堆中添加数据时,是将数组的每一个元素一一插入,插入堆的元素还需要判断其位置是否合理,通过下列方法可以只对插入的元素的一半进行判断操作。二,方法找到第后一个有孩子的结点,判断此结点的位置的值对于它的孩子来说,是不是合理的,然后从此结点开始,向前依次判断每一个结点,直到根结点。对于如图:堆,显然不满足最大堆的性质;方法步骤:1...原创 2018-03-05 19:22:38 · 631 阅读 · 0 评论 -
背包问题----一步一步来
题目:有N种物品和一个容量为V的背包,每种物品都有一件。第i种物品的容量是v[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的容量总和不超过背包容量,且价值总和最大。 下面以这些数据来演示过程:V=10(即总容量为10);步骤一:假设现在只有w[1](只有一件物品,这里从第一件开始),分别用V=0,1,2,3.......10容量的背包去装它,计算对应的价值。(如图);说明:v[1]=2...原创 2018-03-29 20:49:43 · 388 阅读 · 0 评论 -
蓝桥杯-历届试题-承压计算
标题:承压计算X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。每块金属原料的外形、尺寸完全一致,但重量不同。金属材料被严格地堆放成金字塔形。 7 5 8 7 8 8 ...原创 2018-03-25 12:20:04 · 251 阅读 · 0 评论 -
蓝桥杯-历届试题-包子凑数
标题:包子凑数小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。当然...原创 2018-03-25 20:33:45 · 248 阅读 · 0 评论 -
蓝桥杯-历届试题-网络寻路
原创 2018-02-04 16:46:27 · 347 阅读 · 0 评论 -
希尔排序以及对希尔排序增量的讨论和与插入排序的对比
概要:希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:1,插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。(这是为啥呢?点击去看看),2,但插入排序一般来说是低效的,因为插入排序原创 2018-02-07 00:22:38 · 7221 阅读 · 4 评论 -
选择排序
概要:选择排序就是每次从一组数据中取出最小(最大)的数,放在合适的位置;如以下数组:第一次找最小:在第一次寻找最小中,我们发现1是最小的,应该放在第一个位置;所以5和1交换位置(如图);根据同样的方法依次进行下去,就可以完成选择排序了;下面是源代码#includevoid selectSort(int *arr, int n) { for (int i = 0; i原创 2018-02-02 11:18:43 · 148 阅读 · 0 评论 -
插入排序及其优化
概要:先看图:第一次插入:从第二个位置开始;2比5小,所有2应该在5的前面,所以2和5交换位置;第二次插入:3比5小,所有3,应该在5的前面,所以3和5交换位置;然后3比2大,所有2应该在3的前面,所以2和3不交换位置;第三次插入:然后8比5大,所有5应该在8的前面,所以5和8不交换位置;第四次插入:7比8小,所有7应该在8的前面,所以7和8原创 2018-02-02 12:42:58 · 261 阅读 · 0 评论 -
蓝桥杯-历届试题-猴子分苹果
题目:秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分。这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果。第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份,最后把剩下的苹果重新合在一起。这些猴子依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了m个苹果。第二天,这些猴子来到山洞,把剩下的苹果分成n分,巧了,还是剩下了m个。问,原来这些猴子至少采了多少原创 2018-02-02 00:12:22 · 1243 阅读 · 0 评论 -
冒泡排序
概要:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名冒泡排序。如图:第一,二次(冒泡)排序后:原创 2018-02-02 11:40:45 · 185 阅读 · 0 评论 -
蓝桥杯-历届试题-翻硬币
题目:桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。 比如,可能情形是:**oo***oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 规定:把翻动相邻的两个硬币叫做一步操原创 2018-02-03 22:04:50 · 312 阅读 · 0 评论 -
用筛选法求素数
题目:用筛法求之N内的素数。输入:N输出:0~N之间的素数:样例输入:50样例输出:23571113171923293137414347解题思路:什么是筛选法:基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,原创 2018-02-05 21:39:33 · 1184 阅读 · 0 评论 -
归并排序即其优化
一,概要归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二,基本思想:首先给一个数组用(arr来表示):下一步:将原数组分组, 第一次分:5,2,7,4一组,...原创 2018-02-10 16:14:34 · 2345 阅读 · 2 评论 -
选择排序与插入排序对比
概要:选择排序,插入排序。对比方法: 我们通过选择排序和插入排序去进行100000数据量的排序所用时间来对比; (1);写一个帮助类;SortHelper;类中有三个函数:generateRandromArray:用于生产随机数组;testSort:测试调用某个函数所花费的时间;copyArray:数组复制。 //生成n个的随机数组,,每个元素的原创 2018-02-02 15:20:12 · 407 阅读 · 0 评论 -
二分查找法
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。限制:只能对有序的序列进行二分查找。实现:对于以下数组:a[10];现在要找8这个数。第一次二分:mid=(l+r)/2=4; a[mid]=5!=8; 且8>5,所以在mid之后的数组进行二分;第二次,此时l=mid+1,r=9;mid=(l+r)/2=7,a[mid]=8=8,所以找到了8的位置。代码:#in...原创 2018-03-21 21:02:59 · 180 阅读 · 3 评论