文档库 最新最全的文档下载
当前位置:文档库 › c练习题9(郭鑫)递归算法,汉诺塔,快速排序,全排列

c练习题9(郭鑫)递归算法,汉诺塔,快速排序,全排列

c练习题9(郭鑫)递归算法,汉诺塔,快速排序,全排列
c练习题9(郭鑫)递归算法,汉诺塔,快速排序,全排列

练习要点:

1、掌握递归算法。

掌握方法:(将问题分解成同类型子问题)

(1)是数学问题:如果问题可以转化成一个数学公式,类似于:

,则可直接套用递归代码。(2)不是数学问题:如果问题不能用数学公式来表达,则需要将问题分解成几个步骤(指解决问题的步骤),然后将步骤用递归函数来表达。

(3)先设置极限情况:在递归函数里面先设置一个极限情况,便于函数的返回。

[1]用递归算法分别求解1+2+3+……+n的值与1*2*3*……*n的值

[2]用递归算法求解著名的菲波拉契(Fibonacci)数列,其第一项为0,

第二项为1,从第三项开始,其每一项都是前两项的和。求出该数列第N项数据。

[3]一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。用

递归算法求总共有多少种跳法。

[4]用递归算法来解决猴子吃桃问题。

[5]用递归算法求解Hanoi(汉诺)塔问题。

[6]用递归算法完成快速排序。

[7]用递归算法实现全排列。

参考答案

[1] 用递归算法分别求解1+2+3+……+n的值

转换成公式为:

#include

//////////////////////////////////////////////////

//函数名称:sum

//函数功能:求1+2+3+……+n

//函数参数:n表示一个整数

//函数返回值:和

//////////////////////////////////////////////////

int sum(int n)

{

if(n==1)//这是极限情况

return 1;

else

{//其它情况

return n+sum(n-1);

}

}

int main()

{

int n;

printf("n=");

scanf("%d",&n);

printf("sum=%d\n",sum(n));

return 0;

}

运行截图:

[2] 用递归算法求解著名的菲波拉契(Fibonacci)数列,其第一项为0,第二项为1,从第三项开始,其每一项都是前两项的和。求出该数列第N项数据。

转换成公式为:

#include

//////////////////////////////////////////////////

//函数名称:fun

//函数功能:求菲波拉契(Fibonacci)数列第N项值

//函数参数:n表示第n项

//函数返回值:第N项值

//////////////////////////////////////////////////

int fun(int n)

{

if(n==1)//这是极限情况

return 0;

else if(n==2)//这是极限情况

return 1;

else

{//其它情况

return fun(n-1)+fun(n-2);

}

}

int main()

{

int n;

printf("n=");

scanf("%d",&n);

printf("第%d项为:%d\n",n,fun(n));

return 0;

}

运行截图:

[3] 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。用递归算法求总共有多少种跳法。

此问题转化为数学公式为:

当n>2时,跳法数为第一步跳1级与第一步跳2级的所有跳法的和。#include

//////////////////////////////////////////////////

//函数名称:fun

//函数功能:台阶问题

//函数参数:n表示有n个台阶

//函数返回值:跳法数

//////////////////////////////////////////////////

int fun(int n)

{

if(n==1)//这是极限情况

return 1;

else if(n==2)//这是极限情况

return 2;

else

{//其它情况

return fun(n-1)+fun(n-2);

}

}

int main()

{

int n;

printf("n=");

scanf("%d",&n);

printf("%d个台阶总跳法数为:%d\n",n,fun(n));

return 0;

}

运行截图:

[4] 用递归算法来解决猴子吃桃问题。

转化为数学公式为:

#include

//////////////////////////////////////////////////

//函数名称:TotalNum

//函数功能:求第几天的桃子数(在猴子吃之前)

//函数参数:day表示第几天

//函数返回值:返回第几天的桃子数

//////////////////////////////////////////////////

int TotalNum(int day)

{

//这是极限情况

if(day==10)//如果是第10天,则只有一个桃子

return 1;

else

{

//后一天的桃子数加1乘以2

return (TotalNum(day+1)+1)*2;

}

}

int main()

{

int num;

num=TotalNum(1);//求第一天的桃子数

printf("第一天摘的桃子数:%d\n",num);

return 0;

}

运行截图:

[5] 用递归调用来解决Hanoi(汉诺)塔问题。

见练习题8

[6] 用递归算法完成快速排序。

#include

//////////////////////////////////////////////////

//函数名称:quick_sort

//函数功能:快速排序

//函数参数:a[]表示整型数组,L与R分别表示排序起始数位置//函数返回值:无

//////////////////////////////////////////////////

void quick_sort(int a[],int L,int R)

{

if(L>=R)//这是极限情况

return ;

else

{

//x与y表示左右指针,K存储基准数

int x,y,K;

x=L;

y=R;

K=a[L];

//while作用是将所有大于基准数的数放在基准数右边,小于的数放在左边

//while执行完后,x与y将指向同一个数。

while(x

{

//先移y,找到小于K的数

while(x=K)

y--;

if(x

{

a[x]=a[y];

x++;

}

//再移x,找到大于K的数

while(x

x++;

if(x

{

a[y]=a[x];

y--;

}

}

//此时x与y指向同一个数,将基准数放入其中。

a[x]=K;

quick_sort(a,L,x-1);

quick_sort(a,x+1,R);

return ;

}

}

int main()

{

int a[5],i;

for(i=0; i<5; i++)

scanf("%d",&a[i]);

quick_sort(a,0,4);

for(i=0; i<5; i++)

printf("%d ",a[i]);

printf("\n");

return 0;

}

运行截图:

[7] 用递归算法法实现全排列。

#include

//////////////////////////////////////////////////

//函数名称:pai

//函数功能:全排列

//函数参数:a[]表示字符数组,L与R分别表示起始数位置,整个过程R就是指向最后一个字符

//函数返回值:无

//////////////////////////////////////////////////

void pai(char a[],int L,int R)

{

int i;

char t;

if(L==R)//这是极限情况

{

for(i=0;i<=R;i++)

printf("%c ",a[i]);

printf("\n");

return ;

}

else

{

for(i=L;i<=R;i++)

{

t=a[L];a[L]=a[i];a[i]=t;

pai(a,L+1,R);

t=a[L];a[L]=a[i];a[i]=t;

}

}

}

int main( )

{

char a[3]= {'C','E','H'};

int i;

for(i=0; i<3; i++)

printf("%c ",a[i]);

printf("全排列为:\n");

pai(a,0,2);

return 0;

}

运行截图:

c算法大全

一、数论算法 1.求两数的最大公约数 function gcd(a,b:integer):intege r; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod b); end ; 2.求两数的最小公倍数 function lcm(a,b:intege r):integer; begin if a0 do inc(lcm,a); end; 3.素数的求法 A.小范围内判断一个数是否为质数:function prime (n: intege r): Boolean; v ar I: integer; begin for I:=2 to trunc(sqrt(n)) do if n mod I=0 then begin prime:=false; exit;

end; prime:=true; end; B.判断longint范围内的数是否为素数(包含求50000以内的素数表):procedure getprime; v ar i,j:longint; p:array[1..50000] of boolean; begin fillchar(p,sizeof(p),true); p[1]:=false; i:=2; w hile i<50000 do begin if p[i] then begin j:=i*2; w hile j<50000 do begin p[j]:=false; inc(j,i); end; end; inc(i); end; l:=0; for i:=1 to 50000 do

《20以内进位加法-9加几》教学设计

此文档为Word文档,可任意修改编辑 《20以内进位加法-9加几》 【课程简介】凑十法是20以内进位加法的基本思路,计算器法是智障学生计算20以内进位加法的补偿方法。运用凑十法能将20以内的进位加法转化为学生所熟悉的10加几的题目,计算器法是按照算式从左向右依次按出各键得出结果,从而化难为易。 【课程详述】《20以内的进位加法_9加几》这一内容选自北京市石景山区培智中心学校六年级生活数学自编教材下册第三单元“使用家电”这一主题。本节课在“爱心捐赠空气净化器”的生活情境下,回顾了“数数法”和“接着数”,引入了本节课的主要内容:用“凑十法”和“计算器法”解决9加几的问题。这两种方法主要针对培智学校六年级学生不同层次的需要而设计的。在练习环节,在培智学校装了壁挂式和柜式的两种空调实际情境下,让A组B组学生分别用“凑十法”和“计算器法”解决生活中的数学问题。这些情境贴近学生的生活实际,对学生理解生活中的数学有指导意义。本节课的教学重点难点是用“凑十法”和“计算器法”解决9加几的问题。 【教学目标】 知识与技能:

A组通过对问题情境的探索,使学生在已有经验的基础上,自己得出9加几的方法;使学生初步理解“凑十法”,初步了解“9加几”进位加法的思维过程。 B组通过对问题情境的探索,使学生在已有经验的基础上,自己得出9加几的方法;使学生初步掌握“计算器法”,初步了解“9加几”进位加法的计算过程。 过程与方法: A组在观察、操作中逐步培养学生探究、思考的意识与判断、选择的能力。 B组在观察、操作中逐步培养学生投入到现实的、探索性的数学活动中去的能力。 情感态度价值观:培养学生把数学应用到生活实际的意识。【教学重难点】 重点: A组初步掌握用“凑十法”计算“9+几”。 B组初步掌握用“计算器法”计算“9+几”。 难点 A组给9凑十。

c语言程序设计(排序算法)

《高级语言程序设计》 课程设计报告 题目: 排序算法 专业: 班级: 姓名: 指导教师: 成绩: 计算机与信息工程系 2015年3月26日 2014-2015学年 第2学期

目录 引言 (1) 需求分析 (1) 第一章程序内容及要求 (1) 1.1 冒泡排序 (1) 1.2 选择排序 (2) 1.3 插入排序 (3) 第二章概要设计 (4) 2.1冒泡排序 (4) 2.2选择排序 (5) 2.3插入排序 (6) 第三章程序的比较及其应用 (7) 3.1时间复杂度 (7) 3.2空间复杂度 (7) 3.3稳定程度 (7) 3.4应用及其改进 (8) 第四章程序设计结果 (8) 附录 (9) 参考文献 (12)

引言 伴随着社会的发展,数据也变得越来越庞大。如何将庞大的数据进行很好的排序,使用户更加方便的查找资料,成了一件越来越重要的问题。对于程序员来说,这将是一个挑战。 经常查找资料的朋友都会知道,面对海量的资料,如果其查找资料没有进行排序,那么其查找资料将会是一家非常痛苦的事情。针对这一问题,我们自此通过一个课程设计来解决它。 理论上排序算法有很多种,不过本课程设计只涉及到三种算法。这三种算法包括:冒泡排序,选择排序,直接插入排序。 本课程设计通过对这三种算法的运行情况进行对比,选择最优秀的算法出来。希望通过我的努力能解决一些问题,带来一些方便。 需求分析 本课程题目是排序算法的实现,由于各方面的原因,本科程设计一共需要设计三种排序算法。这三种算法包括:冒泡排序,选择排序,直接插入排序。三种排序算法各有独到之处,因此我们要通过各种调试分析来比较其优劣长短。 由于使用的调试软件及操作系统不一样。因此个别程序在不同的软件上可能会报错。 本课程软件运行的的操作系统为Windows7 64位操作系统。所使用的软件为Microsoft Visual C++6.0以及Turbo C2.0 第一章程序内容及要求 1.1 冒泡排序 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

简单的归并排序算法例子

import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Random; public class GuiBing { public static void main(String[] args) throws Exception { int datalength=1000000; GuiBing gui=new GuiBing(); int[] array1=gui.createArray(datalength); int[] array2=gui.createArray(datalength); Thread.sleep(20000); long startTime = System.nanoTime();//纳秒精度 long begin_freeMemory=Runtime.getRuntime().freeMemory(); int[] final_array=gui.guibing(array1,array2); boolean result=gui.testResult(final_array); long end_freeMemory=Runtime.getRuntime().freeMemory(); System.out.println("result===="+result); long estimatedTime = System.nanoTime() - startTime; System.out.println("elapsed time(纳秒精 度):"+estimatedTime/100000000.0); System.out.println("allocated memory:"+(begin_freeMemory-end_freeMemory)/1000.0+" KB"); Thread.sleep(20000); } /** * 显示数组的内容 * @param array */ private static void dispalyData(int[] array) { for(int i=0;i

c排序算法大全

c排序算法大全 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。 对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。我将按照算法的复杂度,从简单到难来分析算法。第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。现在,让我们开始吧: 一、简单排序算法 由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: #include void BubbleSort(int* pData,int Count) { int iTemp; for(int i=1;i=i;j--) { if(pData[j]

9加几和凑十法

《9加几》教学设计 胡碟 教学内容:教科书第88-89页的内容。 教学目标: 1、使学生在现实的情境中,自主探索9加几的计算方法,并在不同算法的交流中,初步理解“凑十法”的计算思路,能正确进行口算。 2、使学生经历计算方法的探索过程,获得一些数学活动的经验,培养初步的观察、分析和比较能力,逐步学会有条理的思考和表达。 3、使学生在参与数学活动的过程中,逐步养成独立思考的习惯,获得一些成功的体验,培养对数学学习的兴趣。 教学重点:正确计算9加几。 教学难点:理解9加几的算理。 教具学具:交互式白板课件,算式卡片和数字卡片。 教学过程: 一、创设情境,引入课题。 1、(课件出示算式,开火车)口算。 点一个小组回答。师:火车开得可真快呀! 我们发现:10+1等于11,10+5等于15,10+几就等于?(生:十几。)对了!这就是我们学过的10加几就等于十几的知识。大家学得可真好!所以呀老师要奖励大家,带你们到运动场去观看比赛,准备好了吗? 2、(出示主题图)请看大屏幕。

师:运动场上热闹吗?(生答:热闹。)说说你看到了什么? 大家想一想运动员们辛苦吗?那我们给他们送点饮料吧? 3、(出示课件)箱子里有几盒?旁边有几盒?数一数。 根据这两个数学信息,谁来提一个数学问题? 4、一共有多少盒?------齐读课题。 求“一共有多少盒”是求部分数还是求总数?用什么方法计算?怎样列式呢?(9+4,师板书)今天我们就来学习9加几的知识。(板书课题,齐读课题) 二、学习新知 1、9加4该怎样计算呢?你是怎么想的? 2、师: 箱子里有9盒,再加上几盒就是10盒?(1盒) 9加()得10?师板书9+( )=10。 现在箱子里有几盒?(10盒)。指着问:这1盒是从哪里来的? 4盒饮料拿走了1盒后,还剩下几盒?(3盒) 10与剩下的3盒,合起来是多少盒?(13盒) 所以,9+4等于多少?(13) 同时板书: 9 + 4 =13 1 3 10 3、课堂小结。(师揭示并板书“凑十法”三个字)

C语言所有内部排序算法

C语言所有内部排序算法冒泡法,选择法,插入法,快排法,希尔,归并,... 1冒泡法: #include #include void mao_pao(int *a,int n) { int i,j,temp,flag; for(i=0;ia[j+1]) { flag=1; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } } void main() { int *a,i,n; a=(int *)malloc(100); if(NULL==a) { printf("allocation failture\n"); exit(1); } printf("请输入你要排序的元素的个数\n"); scanf("%d",&n); printf("现在开始输入%d个元素\n",n); for(i=0;i!=n;++i) scanf("%d",&a[i]);

mao_pao(a,n); printf("排序后为:\n"); for(i=0;i!=n;++i) printf("%d ",a[i]); printf("\n"); free(a); } 2,选择排序法 #include #include void xuan_zhe(int *a,int n) { int i,j,temp,max; for(i=0;i

9加几进位加法

9加几进位加法 范县第一小学晁轶群 教学目标: 理解“凑十法”的算理,会用凑十法准确计算9加几。 教学重难点: 利用凑十法计算9加几 教具准备: 多媒体课件 教学过程: 一、复习与导入。 1、出示课题及目标:理解凑十法,能利用凑十法计算9加几。 引导思考,从名字上来看,你认为凑十法是什么? 2、口算练习 12+5= 10+2= 11+1= 10+6= 15+4= 10+9= 13+3= 10+5= 11+3= 10+1= 15+3= 10+7= 13+2= 10+3= 14+2= 10+4= 12+2= 10+8= 通过比较,得出:10加几容易计算。 二、创设情境,引入新课。 1、出示运动会场景画面。让学生自己观察并说出发现。 2、解决“还有多少盒饮料”的问题。 为了给运动员解渴,准备了很多饮料,“一共有多少盒饮料?”。 让学生思考解决问题的方法,小组内交流,互相启发,共同解决这个问题。 组织交流解决问题的方法。请小组的代表向全班同学介绍本组解决问题的方法。 (1)教师讲解一般方法,再用“凑十法”算出结果。 (2)充分肯定学生探索的方法,并以“你喜欢哪一种方法”为题,让学生交流自己的体会,加深学生对各种解决方法的认识。 (3)强化“凑十法”。用课件演示。 教师先指出:纸箱内有9盒饮料,箱外有4盒饮料,这两部分合并在

一起,就是现在有的饮料。所以要用9+4计算。(板书:9+4) 问:怎样算出9+4的得数呢? 让学生重述凑10的过程:放进箱里1盒是10盒,箱外面还有3盒,10盒加上3盒一共是13盒。 在学生思考的基础上,教师总结:因为9+1得10,所以算9+4,先把4分成1和3;9加1得10,再加3得13。 教师板书“=13”。让学生齐读算式。 3、解决做一做的第一题,课件演示,教师板书。 三、总结规律: 见9想1,把另一个加数分成1和几,9加1得10,10加几就是十几。这样的得数都超过了10的加法,就是进位加法。 四、练习巩固: 1、完成做一做的2题。比较两个式子的联系。 2、做一做的3题,一个加数不变,另一个加数变大,和也变大。渗透函数思想。 3、练习二十的3题。 板书设计: 9加几的进位加法 学习目标:掌握“凑十法”, 9+4=13 准确计算9加几。 9+5=14 9+7=16 课后小结:

归并排序算法实现 (迭代和递归)

归并排序算法实现(迭代和递归)\递归实现归并排序的原理如下: 递归分割: 递归到达底部后排序返回: 最终实现排序: #include void merge(int *array, int low, int center, int high) { if(low >= high) return; int m = center - low + 1; int n = high - center; int L[m], R[n]; for(int i=0; i R[j]) array[k] = R[j++]; else array[k] = L[i++];

} while(i #include

c语言各种排序法详细讲解

一插入排序 1.1 直接插入排序 基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。 图解:

1.//直接顺序排序 2.void InsertSort(int r[], int n) 3.{ 4.for (int i=2; i

代码实现: [cpp]view plain copy 1.//希尔排序 2.void ShellSort(int r[], int n) 3.{ 4.int i; 5.int d; 6.int j; 7.for (d=n/2; d>=1; d=d/2) //以增量为d进行直接插入排序 8. { 9.for (i=d+1; i0 && r[0]

典型排序的C语言实现及其思路解析

1. 基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 2. 排序过程: 【示例】: 初始关键字[49 38 65 97 76 13 27 49] 第一趟排序后13 [38 65 97 76 49 27 49] 第二趟排序后13 27 [65 97 76 49 38 49] 第三趟排序后13 27 38 [97 76 49 65 49] 第四趟排序后13 27 38 49 [49 97 65 76] 第五趟排序后13 27 38 49 49 [97 97 76] 第六趟排序后13 27 38 49 49 76 [76 97] 第七趟排序后13 27 38 49 49 76 76 [ 97] 最后排序结果13 27 38 49 49 76 76 97 3. void selectionSort(Type* arr,long len) { long i=0,j=0;/*iterator value*/ long maxPos; assertF(arr!=NULL,"In InsertSort sort,arr is NULL\n"); for(i=len-1;i>=1;i--) { maxPos=i; for(j=0;j

9加几754125

《9加几》教学设计 一、教学目标: (一)知识与技能 初步学会用“凑十法”计算20以内的进位加法,能正确计算9加几的进位加法。(二)过程与方法 在探索9加几的进位加法的过程中,通过学生的操作和教师的演示,理解并掌握“凑十法”在计算中的方便与快捷,达到准确计算的程度。 (三)情感态度和价值观 使学生体验数学与生活的联系,感受数学在生活中的价值,初步渗透转化思想。二、目标分析 本课教学目标是9加几的进位加法,它是学习20以内进位加法的开始,通过学生摆一摆、画一画、说一说等活动方式,理解“10个一转化为1个10”,并掌握“凑十法”。 三、教学重难点 教学重点:掌握“凑十法”,正确计算9加几的计算方法。 教学难点:使学生形成“凑十法”的思考过程。 四、教学准备 小棒,圆片磁铁 五、教学过程 (一)回顾旧知,激活认知 出示口算,抢答 10+2 4+10 5+10 10+7 (1)怎么算得这么快呀? (2)学生总结:十加几就等于十几。 小结:看来,“10”真是我们的好朋友,它能把复杂的计算变得很简单。 (二)自主参与,探究新知 1.提取信息,发现问题 (1)课件出示主题图: 运动会赛场。 教师:在运动会赛场,你发现哪些信息? 学生看图之后互相说一说。(有啦啦队、赛跑的、跳绳比赛) (2)重点研究“饮料”图片提供的问题。 ①发现信息,提出问题。 从这幅图中,发现哪些信息?能提出什么问题? ②学生交流信息。 箱子里有9盒饮料,外面有4盒饮料,一共有多少盒饮料呢? 2.自主探究,解决问题 (1)学生先独立思考,再小组内交流。 (2)学生汇报。(预设学生回答) ①生1:1、2、3……12、13依次数。 ②生2:从9数到13。 ③生3:先拿1盒放到箱子里,再算10+3=13 (3)发现方法间的区别与联系 ①这几种方法,哪种最熟悉?(前两种方法)

排序算法C语言版:直接插入排序

直接插入排序 算法思想简单描述: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 直接插入排序是稳定的。算法时间复杂度O(n^2) 算法实现: /* 功能:直接插入排序 输入:数组名称(也就是数组首地址)、数组中元素个数 */ void insert_sort(int *x, int n) { int i, j, t; for (i=1; i

*/ t=*(x+ I ); for (j=i-1; j>=0 && t<*(x+j); j--) /*注意:j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。*/ { *(x+j+1) = *(x+ j ); /*如果满足条件就往后挪。最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/ } *(x+j+1) = t; /*找到下标为i的数的放置位置*/ } }

#include "stdio.h" #include "conio.h" main() { int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf("original array is:\n"); for(i=0;i<10;i++) printf("%5d",a[i]); printf("\n"); printf("insert a new number:"); scanf("%d",&number); end=a[9]; if(number>end) a[10]=number; else { for(i=0;i<10;i++) { if(a[i]>number) { temp1=a[i]; a[i]=number; for(j=i+1;j<11;j++) { temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } for(i=0;i<11;i++) printf("%6d",a[i]); getch();

人教版数学一年级上册9加几练习题学习

一、教学目标 1、通过对问题情境的探索,使学生初步理解“凑十法”和“9加几”进位加法的思维过程并能正确计算。 2、初步培养学生提出问题、解决问题的能力和创新意识。 3、通过合作交流和动手操作等活动,培养学生的探究意识和合作学习意识。 二、教学重难点 教学重点:渗透转化思想,应用“凑十法”正确计算9加几的进位加法。 教学难点: “凑十法”的思考过程。 三、教学准备:PPT课件、题卡、自制学具、小棒20根。 四、教学过程 (一)激发兴趣,复习铺垫 1、谈话引入:同学们,我们学校正在开运动会,你们想去参加吗要想参加,就得先过两关,下面就让我们闯关吧。 1、10+2 =10+9 =10+6 =7+10=3+10= 2、2+9+8=3+8+7=6+5+5=4+7+6=9+9+1= 2、师:我们顺利地闯过了两关,赶快到运动场去吧,那里的运动会已经开始了!(出示校园运动会的场景图) 二、自主尝试,探究算法 1、创设情报境,教学例1 (1)师:运动场上的比赛热闹极了,请仔细看一看,同学们都参加了哪些比赛项目生:有踢毽子的、跳绳的、跑步的、跳远的。 (2)你最喜欢哪个比赛项目,数一数每个项目有多少人 生:我最喜欢跳绳的,有3人参加。…… (3)师:同学们观察的可真仔细,这些运动员参加这些比赛很辛苦,于是学校服务队的小朋友的小朋友给运动员准备了许多好喝的饮料(出示数饮料画面),送走了了一些,请仔细看一看,还有多少盒没送引导学生看图列算式,板书9 + 4 这就和今天我们要学习的知识有关了,今天我们就来学历9+几 2、探究算法 9+4等于几呢请同学们用小卡片摆一摆,说说你是用什么方法计算的。教师巡回指导。 3请学生展示不同的方法,可能出现的有: a.我们是接着数的,10、11、12、13。(接数法) b.我们是一个一个数的,1、2、3、4 ··· 12、13.(点数法) c.我是先从右边拿一个放到左边,左边是10,右边是3,加起来是13。(凑十法) 教师追问:为什么要把这个拿到左边去呢做什么用呢 引导学生回答:这样左边正好有10个了,10+3好算。 3、归纳算法 这是一个好方法,我们知道了10加几就等于十几,所以啊我们可以想:9加几等于10(1)。 板演:把4分成1和3,9加1等于10,10再加3等于13。这个方法真好。 三、讲练结合掌握“凑十法” 看到同学们知道了9+4等于13,聪聪可高兴了,他还要请我们帮忙,大家愿意帮助他吗 1、(出示课件)聪聪发现的运动会上有9个踢毽子的,还有6个跳远的,怎么算出一共有多少个人怎样列算式

C C++笔试面试题目汇总3——各种排序算法

C/C++笔试面试题目汇总3——各种排序算法 原文:https://www.wendangku.net/doc/fc16870345.html,/u/1222/showart_318070.html 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。 第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。 第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。 第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。 一、简单排序算法 由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法:(Gilbert:点这里有视频) 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: #include void BubbleSort(int* pData,int Count) { int iTemp; for(int i=1;i=i;j--) { if(pData[j]

归并排序分治策略的设计与实现

实验名称归并排序分治策略的设计与实现实验方案实验成绩实验日期实验室信息系统设计与仿真室I 实验操作 实验台号班级姓名实验结果 一、实验目的 1、熟悉分治法求解问题的抽象控制策略; 2、熟悉在顺序存储表示下求解分类问题的递归算法设计; 3、通过实例转换, 掌握分治法应用。 二、实验任务 ①从文件中读取数据信息; ②利用归并排序算法,进行排序; ③输出排序结果。 三、实验设计方案 1、结构体设计 用数组存放排序数据。 2、自定义函数设计 ①函数原型声明 int input(int A[]); //从文件读入待排序的数据 void merge(int A[],int low,int mid,int high); // 两个相邻有序数组的归并 void mergesort(int A[],int low,int high); // 归并排序 void input(int A[], int n); // 输出排序结果 ②两个相邻的有序子数组的合并 思路:从两个已排好序的子数组的首元素开始,依次比较大小,按从小到大的顺序存放在b[]数组中,然后转存到A[]数组中。 void merge(int A[],int low,int mid,int high) { int b[N]; int i,j,k = 0; int l = low; //已排序部分1的起始下标 int h = mid+1; //已排序部分2的起始下标 while(l <= mid && h <= high) //两个有序部分合并到b数组中 if(A[l] < A[h]) b[k++] = A[l++]; else

c语言程序设计(排序算法)

《高级语言程序设计》 课程设计报告 题目: 排序算法 专业: 班级: 姓名: 指导 教师: 成绩: 计算机与信息工程系 2015年3月26日 2014-2015学年 第2学

目录

引言 伴随着社会的发展,数据也变得越来越庞大。如何将庞大的数据进行很好的排序,使用户更加方便的查找资料,成了一件越来越重要的问题。对于程序员来说,这将是一个挑战。 经常查找资料的朋友都会知道,面对海量的资料,如果其查找资料没有进行排序,那么其查找资料将会是一家非常痛苦的事情。针对这一问题,我们自此通过一个课程设计来解决它。 理论上排序算法有很多种,不过本课程设计只涉及到三种算法。这三种算法包括:冒泡排序,选择排序,直接插入排序。 本课程设计通过对这三种算法的运行情况进行对比,选择最优秀的算法出来。希望通过我的努力能解决一些问题,带来一些方便。 需求分析 本课程题目是排序算法的实现,由于各方面的原因,本科程设计一共需要设计三种排序算法。这三种算法包括:冒泡排序,选择排序,直接插入排序。三种排序算法各有独到之处,因此我们要通过各种调试分析来比较其优劣长短。 由于使用的调试软件及操作系统不一样。因此个别程序在不同的软件上可能会报错。 本课程软件运行的的操作系统为Windows7 64位操作系统。所使用的软件为Microsoft Visual C++6.0以及Turbo C2.0 第一章程序内容及要求 1.1 冒泡排序 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

数据结构实验-归并排序算法

大连理工大学实验预习报告 学院(系):电信专业:班级: 姓名:学号:组:___ 实验时间:实验室:实验台: 指导教师签字:成绩: 实验名称Merge sort 一、实验目的和要求 (一)、实验目的 Design the merge sort algorithm and implement it in C language 设计归并排序算法并于C语言实现。 (二)、实验要求 Requirements: 1) Analyze the time complexity of your algorithm 2) Submit the document explaining your algorithm as well as the source code. 要求: 1)分析算法的时间复杂度。 2) 提交的文档中说明你的算法和源代码。 二、实验原理 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可 解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了? 可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

C语言常用排序算法

/* ===================================================================== ======== 相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义): 1、稳定排序和非稳定排序 简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就 说这种排序方法是稳定的。反之,就是非稳定的。 比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为 a1,a2,a4,a3,a5, 则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4, a2,a3,a5就不是稳定的了。 2、内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序; 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。 3、算法的时间复杂度和空间复杂度 所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。 ===================================================================== =========== */ /* ================================================ 功能:选择排序 输入:数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ /* ==================================================== 算法思想简单描述:

多路归并排序 外部排序算法

关于多路归并排序外部排序败者树技术积累2009-11-24 21:52:06 阅读453 评论0 字号:大中小 编程珠玑第一个case是有关一个技巧性解决外部排序问题的。问题很巧妙的解决了,但一开始提到的利用归并排序进行外部排序的算法仍值得仔细探究一下,毕竟本科时学的不是很深入。 先来看内部排序中最简单的2路归并排序算法。 算法核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,给定数组中序列界限i、m、n,用2个下标变量分别从i和j=m+1开始逐个往后处理,先比较,小的写到结果序列的当前遍历下标k中,相应下标自增继续比较直到某个序列的下标走到边界,再将另外一个序列的剩余元素拷贝到结果序列中。 算法可用递归或递推实现,从相邻的两两元素开始不断调用上面的核心操作组成较长有序序列直到完成整个序列。 算法进行一趟归并就得到一个局部有序的完整新序列,n个元素共需要log2n趟归并,每趟完成比较操作n次(1次得到序列的1个值),得到的新序列写到结果序列空间中,下一趟之前要先将结果序列复制一份到临时空间,下一趟归并在临时空间上进行。因此时间复杂度nlog2n,空间上除了原始序列空间n、结果序列空间n,还需要辅助临时空间n。 接下来看外部排序。外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。 多路归并排序算法在常见数据结构书中都有涉及。从2路到多路(k路),增大k可以减少外存信息读写时间,但k个归并段中选取最小的记录需要比较k-1次,为得到u个记录的一个有序段共需要(u-1)(k-1)次,若归并趟数为s次,那么对n个记录的文件进行外排时,内部归并过程中进行的总的比较次数为s(n-1)(k-1),也即(向上取整)(logkm)(k-1)(n-1)=(向上取整)(log2m/log2k)(k-1)(n-1),而(k-1)/log2k随k增而增因此内部归并时间随k增长而增长了,抵消了外存读写减少的时间,这样做不行,由此引出了“败者树”tree of loser的使用。在内部归并过程中利用败者树将k个归并段中选取最小记录比较的次数降为(向上取整)(log2k)次使总比较次数为(向上取整)(log2m)(n-1),与k无关。 败者树是完全二叉树,因此数据结构可以采用一维数组。其元素个数为k个叶子结点、k-1个比较结点、1个冠军结点共2k个。ls[0]为冠军结点,ls[1]--ls[k-1]为比较结点,ls[k]--ls[2k-1]为叶子结点(同时用另外一个指针索引b[0]--b[k-1]指向)。另外bk为一个附加的辅助空间,不属于败者树,初始化时存着MINKEY的值。 多路归并排序算法的过程大致为:首先将k个归并段中的首元素关键字依次存入

相关文档
相关文档 最新文档