算法排序
Serendipity_筱楠
当你的才华还撑不起你的野心的时,你就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来历练。
展开
-
回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列
回溯法题目描述:设计一个算法在1、2、3… 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如1+2+34-5+67-8+9=100分析思路:用数组a存放1 ~ 9的整数,用字符数组op存放插入的运算符,op[i]表示在a[i]之前插入的运算符。采用回溯法产生和为100的表达式,op[i]只能取+、- 或者空格。设计函数fun(op,sum,prevadd,a,i)sum:记录考虑整数a[i]时前面表达式计算的整数和(初始值为a[0])原创 2020-09-20 17:22:31 · 3936 阅读 · 2 评论 -
分治法 ——查找问题 —— 寻找两个等长有序序列的中位数
查找问题:问题一:寻找两个等长有序序列的中位数原创 2020-08-26 22:10:44 · 6473 阅读 · 4 评论 -
分治法——查找问题 —— 寻找一个序列中第k小的元素和查找最大和次大元素
问题:对于给定的含有n个元素的无序序列,求这个序列中第k(1<=k<=n)小的元素分析思路:假设无序序列存放在a[0 … n-1]中,若将a递增排序,则第k小的元素为a[k-1].对于无序序列a[s … t],在其中查找第k小的元素(1)若s>=t,其中只有一个元素或没有任何...原创 2020-08-25 20:00:36 · 7397 阅读 · 3 评论 -
分治法 —— 快速排序和归并排序(自底向上和自顶向下)
问题:对于给定的含有n个元素的数组a,对其按元素值递增排序。快速排序1.基本思想:划分:在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入最终元素后,整个数据序列被基准分割成两个子序列,所有小于基准的元素放在前子序列中,所有大于基准的元素放置在后子序列中,并把基准排在这两个子序列中间。2.分治策略:(1)分解:将原序列a[s…t]分解成两个子序列a[s … i-1]和a[i+1 … t],其中i为划分的基准位置,即将整个问题划分为两个自问题(2)求解子问题原创 2020-08-25 16:35:22 · 4026 阅读 · 0 评论 -
分治法 —— 折半查找(递归与非递归)
折半查找(二分查找)假设为递增有序基本思路时间复杂度:O(log2 n)设a[low…high]是当前查找区间,首先确定该区间的中点位置mid=L(low+high)/2I,然后将待查的k值与a[mid].key比较(1)若k==a[mid].key,则查找成功并返回该元素的物理下标(2)若k<a[mid],则由表的有序性可知a[mid…high]均大于k,因此若表中存在关键字等于k的元素。则该元素必位于左子表a[low…mid]中,新的查找区间是左子表a[low…mid-1](3)原创 2020-08-24 21:59:48 · 4210 阅读 · 0 评论 -
递归算法设计 —— 选择排序和冒泡排序
问题:对于给定的含有n个元素的数组a,分别采用选择排序和冒泡排序方法:将a[0…n-1]分为有序区a[0…n-1]和无序区两个部分,有序区中的所有元素都不大于无序区中的元素,初始时有序区为空,即i=0,经过n-1趟排序(i=1~n-2),每趟排序采取不同方式将无序区中的最小元素移动到无序区的开头,即a[i]处。选择排序采用比较方式在无序区中选择最小元素并放到开头设f(a,n,i)用于在无序区a[i…n-1] (共n-i个元素)中选择最小元素并放在a[i]处,是“大问题“则f(a,n,i原创 2020-08-24 12:11:24 · 1967 阅读 · 0 评论 -
递归法:求n个元素的全排列
问题:求n个元素的全排列举例:ABC 其全排列有ABC ACB BAC BCA CAB CBApublic class Quan { public static void f(char[] data,int k) //k为当前需要交换元素的位置,与它后面的元素交换 { if(k==data.length) { //当k交换到最后一个元素的位置时,打印输出结果 for(...原创 2020-02-11 22:57:44 · 4422 阅读 · 0 评论 -
2014蓝桥杯C++A:猜年龄;扑克序列(全排列)
一、题目:猜年龄小明带两个妹妹参加元宵灯会。别人问他们多大了,他们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”请你写出:小明的较小的妹妹的年龄分析思路:年龄之积是年龄之和的6倍,可以得到一个等式且年龄差不超过8代码:#include<iostream>using namespace std;int ...原创 2020-03-18 22:26:18 · 603 阅读 · 0 评论 -
试题12 交叉排序(小-大,大-小)
题目:蒜头君很无聊,现有N个数,其中第i个数是Ai。现在他先将Al1,Al1+1,…Ar1从小到大排序再将Al2,Al2+1,…Ar2从大到小排序请输出A排序后的最终结果输入格式N,l1,r1,l2,r2(l1<r1,l2<r2),均不超过100000.第二行N个不超过int数据范围,标识A数组。输出格式一行N个用空格分隔的整数,表示A排序以后的结果。样例输入6 1 3 2 48 3 1 6 9 2样例输出1 8 6 3 9 2分析思路:直接读入两组数,先进原创 2020-05-17 21:42:16 · 349 阅读 · 0 评论 -
试题11 蒜头君的随机数(排序和去重)
题目:蒜头君想在学校里请一些同学一起做一项问卷调查,为确保实验客观性,他先用计算机生成n(i<=n<=100)个1到1000之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应不同的学生的学号。然后把这些数从小到大排序。请完成“去重"和"排序”的工作输入格式共两行,第一行为一个正整数n第二行有n个用空格隔开的正整数,为所产生的随机数输出格式每一行输出一个正整数m,表示不相同的随机数的个数,第二行输出m个用空格隔开的正整数,为从小到大排好序的不相同的随机数原创 2020-05-17 21:10:01 · 382 阅读 · 0 评论 -
试题3 基础练习 数列排序
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200输入格式 第一行为一个整数n。 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式 输出一行,按从小到大的顺序输出排序后的数列。 样例输入58 3 6 4 9样例输出3 4 6 8 9分析思路:这是一道快速排列的题目less():为从小到大排序greater()r:为从大到小排序代码:#include<iostream>#原创 2020-05-10 20:08:29 · 364 阅读 · 0 评论 -
数组和指针:超过一半的数字;水王发帖
二、超过一半的数字:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字可以看出6出现的次数超过了数组长度的一半数组长度为偶数当出现次数最多的元素恰好全部排在左半区间时,利用快速排序会很难判断当出现次数较多的元素排列在正中间时,可以利用快速排序,可以返回数组5和6的下标当出现次数较多的元素全部出现在右半区间时,也很难判断题目:Tango是微软亚洲研究院的一个试验项目。研究...原创 2020-04-07 12:33:58 · 197 阅读 · 0 评论 -
2017蓝桥杯C++A:分巧克力(两种方法)
九、题目:分巧克力儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:1. 形状是正方形,边长是整数2. 大小相同例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。当然小朋友们都希望得...原创 2020-04-01 20:08:55 · 1763 阅读 · 6 评论 -
2016蓝桥杯C++A:剪邮票(抓取法)
七、题目:剪邮票如【图1.jpg】, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。请你计算,一共有多少种不同的剪取方法。请填写表示方案数目的整数。分析思路:1.初始思路:2.暴力解法:想到枚举所有的5张邮票的组合,从12个中看是不是一个连通...原创 2020-03-29 22:58:55 · 281 阅读 · 0 评论 -
2016蓝桥杯C++A:寒假作业(详细解析)
六、题目:寒假作业:现在小学的数学题目也不是那么好玩的。看看这个寒假作业:□ + □ = □□ - □ = □□ × □ = □□ ÷ □ = □每个方块代表1~13中的某一个数字,但不能重复。比如:6 + 7 = 139 - 8 = 13 * 4 = 1210 / 2 = 5以及:7 + 6 = 139 - 8 = 13 * 4 = 1210 / 2...原创 2020-03-28 20:03:09 · 691 阅读 · 0 评论 -
2016蓝桥杯C++A:快速排序(详解版,很快掌握)
四、题目:快速排序填空题排序在各种场合经常被用到。快速排序是十分常用的高效率的算法。其思想是:先选一个“标尺”,用它把整个队列过一遍筛子,以保证:其左边的元素都不大于它,其右边的元素都不小于它。这样,排序问题就被分割为两个子区间。再分别对子区间排序就可以了。下面的代码是一种实现,请分析并填写划线部分缺少的代码。#include <stdio.h>void swap...原创 2020-03-25 22:26:32 · 339 阅读 · 0 评论 -
排序算法的总结与使用题型
基于比较的排序1.冒泡排序:谁大谁在最前面,每一轮把最大的顶到天花板上效率太低—O(n^2)-------掌握swap2.选择排序:效率太低,但经常用它内部的循环方式来找到最大值和最小值----怎么一次性求出数组–O(n^2)3.插入排序:虽然平均效率低,但在序列基本有序时,它会很快,所以也有其使用范围4.希尔排序:缩小增量排序,是插入排序的改良,对空间思维训练有帮助分治法:子问...原创 2020-03-01 18:32:00 · 229 阅读 · 0 评论 -
最小可用ID(4种方法,详细讲解)
三、最小可用ID:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000原创 2020-02-23 15:48:37 · 1615 阅读 · 5 评论 -
经典排序:第k个元素(快排和双向扫描法)
一、第k个元素:以尽量高的效率求出一个乱序数组中按数值顺序的第k个元素乱序数组法一:利用快速排序,算法时间复杂度O(Nlogn)法二:利用分区排序法(双向扫描法)依次与主元比较,比主元大的排在右面不变,比主元小的指针交换位置,得到如下数组伪代码selectk(A,p,r,k){ q=partition(A,p,r); //q主元的下标 qk=q-p+1; //主元是...原创 2020-02-22 21:51:51 · 323 阅读 · 0 评论 -
归并排序(数组指针详细讲解,图例分析)
归并排序思路:依照分治模式分解:将n个元素分成各含n/2个元素的子序列;解决:对两个子序列递归地排序合并:合并两个已排序的序列的子序列以得到排序结果和快排区别:归并的分解较为随意,重点是合并...原创 2020-02-21 21:43:03 · 507 阅读 · 0 评论 -
三分法:有相同元素值快速排序(双向扫描出现3个指针)
在双向扫描的时候,会出现小于等于的情况,这时用三分法,用三个指针,把区间分为4块,如图所示,左指针向右扫描,小于主元的元素保持原位置不变,当出现等于主元的元素的时候,eq指针移动到等于主元元素的位置交换之后继续扫描当出现以下的局面的时候,这时eq停留在第一个相等元素的位置sp继续扫描未知区间,若是相等合并到eq区间,小于则和eq指针交换,大于则是与r指针交换总结:小于主元,sp位置和eq...原创 2020-02-20 22:00:58 · 990 阅读 · 0 评论 -
双向扫描法
双向扫描法思路:头尾指针从两端往中间扫描,从左找到大于主元的元素,从右找到小于等于主元的元素二者交换,继续扫描,直到左侧的元素都大于等于右侧的元素。1.一般以第一个元素作为主元(基准),左指针指向第二个元素,右指针指向最后一个元素,左指针指向的元素要是小于或等于主元,继续向右扫描,右指针指向的元素大于主元,所在位置元素保持不变,继续向左扫描。2.当左指针指向的元素大于主元,与右指针此时指向的...原创 2020-02-20 21:22:32 · 3022 阅读 · 0 评论 -
分治法:快排划分法(单向扫描法)
一、分治法将一个规模较大的问题转化为多个相同形式小规模的子问题,子问题规模较小时,可自然求解。子问题的解可通过合并得到原问题的解。举例:小明让小张和小李去借2000元,小张借1000,小李借1000,他们各自向朋友去借,这就是一个分治问题二、一遍单向扫描法:思路:用两个指针将数组划分为三个区间。扫描指针左边是确认小于等于主元的。扫描指针右边是确认大于主元的...原创 2020-02-20 13:00:48 · 859 阅读 · 0 评论 -
冒泡排序(画图分析)
1、定义:算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。2.步骤**:**(1)、从头开始,按照大的排在后面的次序(也可小的排在后面)进行两两交换,假定经过一轮两两交换后,最后一个数字为最大的;(2)、第二次,除最后一个不参与比较之外,其余数字按第一步骤依次进行。(3)、重复上述步骤,...原创 2019-12-08 16:46:20 · 881 阅读 · 0 评论