C++经典问题算法分析
- 格式:doc
- 大小:756.50 KB
- 文档页数:45
C程序经典算法50例1.二分查找算法:在有序数组中查找指定元素。
2.冒泡排序算法:通过不断比较相邻元素并交换位置,将较大的元素向后冒泡。
3.快速排序算法:通过选择一个基准元素,将数组分割为左右两部分,并递归地对两部分进行快速排序。
4.插入排序算法:将数组划分为已排序和未排序两部分,每次从未排序中选择一个元素插入到已排序的合适位置。
5.选择排序算法:遍历数组,每次选择最小元素并放置在已排序部分的末尾。
6.希尔排序算法:将数组按照一定间隔进行分组并分别进行插入排序,然后逐步减小间隔并重复这个过程。
7.归并排序算法:将数组递归地划分为两部分,然后将两个有序的部分进行合并。
8.桶排序算法:将元素根据特定的映射函数映射到不同的桶中,然后对每个桶分别进行排序。
9.计数排序算法:统计每个元素的出现次数,然后根据计数进行排序。
10.基数排序算法:从低位到高位依次对元素进行排序。
11.斐波那契数列算法:计算斐波那契数列的第n项。
12.阶乘算法:计算给定数字的阶乘。
13.排列问题算法:生成给定数组的全排列。
14.组合问题算法:生成给定数组的所有组合。
15.最大连续子序列和算法:找出给定数组中和最大的连续子序列。
16.最长递增子序列算法:找出给定数组中的最长递增子序列。
17.最长公共子序列算法:找出两个给定字符串的最长公共子序列。
18.最短路径算法:计算给定有向图的最短路径。
19.最小生成树算法:构建给定连通图的最小生成树。
20.汉诺塔算法:将n个圆盘从一个柱子移动到另一个柱子的问题。
21.BFS算法:广度优先算法,用于图的遍历和查找最短路径。
22.DFS算法:深度优先算法,用于图的遍历和查找连通分量。
23.KMP算法:字符串匹配算法,用于查找一个字符串是否在另一个字符串中出现。
24.贪心算法:每次都选择当前情况下最优的方案,适用于求解一些最优化问题。
25.动态规划算法:将一个大问题划分为多个子问题,并通过子问题的解求解整个问题,适用于求解一些最优化问题。
c算法技巧
1. 递归:递归是一种通过函数自身不断调用自身来解决问题的方法。
它在处理阶乘、斐波那契数列等问题时非常有效。
2. 动态规划:动态规划是一种通过把问题分解为相互联系的子问题,并保存子问题的解,以避免重复计算的算法技巧。
它常用于求解背包问题、最长回文子串等问题。
3. 贪心算法:贪心算法是一种在每一步选择当前看起来最优的解决方案,而不考虑整体问题的最优解的算法技巧。
它在找零、最小生成树等问题中有应用。
4. 回溯法:回溯法是一种通过递归和回溯技巧来搜索问题的所有可能解的算法技巧。
它常用于解决数独、八皇后问题等。
5. 排序算法:排序算法是一种将一组数据按照特定顺序进行排列的算法技巧。
常见的排序算法有冒泡排序、插入排序、选择排序、快速排序等。
6. 图算法:图算法是用于处理图结构的算法技巧,如图的遍历、最短路径、最小生成树等。
7. 字符串算法:字符串算法是用于处理字符串的算法技巧,如字符串匹配、字符串查找、字符串拼接等。
这些只是 C 算法技巧的一部分,还有许多其他的算法技巧可以在特定的问题中发挥作用。
选择合适的算法技巧需要根据问题的特点和要求进行分析和考虑。
C语言经典算法题目及答案题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++) /*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k)printf("%d,%d,%d\n",i,j,k);}}====================================== ========================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}====================================== ========================【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
C语言迭代法经典例题:求解斐波那契数列
斐波那契数列是一个经典的数学问题,可以使用迭代法来求解。
下面是一个使用C语言实现斐波那契数列的示例代码:
在上述代码中,我们首先使用scanf函数从标准输入中读取一个正整数n,表示要求解斐波那契数列的前n项。
然后,我们定义变量f1、f2和f3,分别表示斐波那契数列的前三项。
接着,我们使用for循环迭代求解斐波那契数列,每次循环输出当前项的值,并更新下一项的值。
最后,我们返回0表示程序正常结束。
需要注意的是,在实际应用中,需要根据具体的问题和数据规模选择合适的算法和数据结构,以提高程序的效率和正确性。
c语言面试中常问的算法题目
在 C 语言面试中,常常会涉及一些算法题目,以下是一些常见
的算法题目及其解答:
1. 反转字符串:
题目,给定一个字符串,将其反转。
解答,可以使用两个指针,一个指向字符串的起始位置,另
一个指向字符串的末尾位置,然后交换两个指针所指向的字符,然
后两个指针向中间移动,重复这个过程直到两个指针相遇。
2. 判断字符串是否为回文串:
题目,给定一个字符串,判断它是否是回文串(正读和反读
都相同)。
解答,可以使用两个指针,一个指向字符串的起始位置,另
一个指向字符串的末尾位置,然后逐个比较两个指针所指向的字符,如果不相等则不是回文串。
3. 查找数组中的最大值和最小值:
题目,给定一个整数数组,找出数组中的最大值和最小值。
解答,可以使用两个变量分别保存当前的最大值和最小值,然后遍历数组,逐个比较并更新最大值和最小值。
4. 实现快速排序算法:
题目,给定一个整数数组,使用快速排序算法对数组进行排序。
解答,快速排序算法的基本思想是选择一个基准元素,将数组分为两部分,一部分小于基准元素,一部分大于基准元素,然后递归地对两部分进行排序。
5. 判断一个数是否为素数:
题目,给定一个整数,判断它是否为素数(只能被 1 和自身整除)。
解答,可以使用循环遍历从 2 到该数的平方根,逐个判断是否能整除该数,如果能整除则不是素数。
以上是一些常见的在 C 语言面试中经常被问到的算法题目及其解答。
当然,还有很多其他的算法题目,希望这些题目能帮助您更好地准备面试。
C语言经典算法100例C语言经典算法100例题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?__________________________________________________________________程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....__________________________________________________________________ _程序源代码:main(){long f1,f2;int i;f1=f2=1;for(i=1;ii++){ printf(“%12ld %12ld",f1,f2);if(i%2==0) printf("\n");/*控制输出,每行四个*/f1=f1+f2;/*前两个月加起来赋值给第三个月*/f2=f1+f2;/*前两个月加起来赋值给第三个月*/}}上题还可用一维数组处理,you try!题目:判断101-200之间有多少个素数,并输出所有素数。
__________________________________________________________________程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
__________________________________________________________________ _程序源代码:#include "math.h"main(){int m,i,k,h=0,leap=1;printf("\n");for(m=101;m=200;m++){ k=sqrt(m+1);for(i=2;ii++)if(m%i==0){leap=0;break;}if(leap) {printf("%-4d",m);h++;if(h%10==0)printf("\n");}leap=1;}printf("\nThe total is %d",h);}题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
c语言枚举法例题及解题思路一、引言枚举法是一种常用的编程方法,通过列举所有可能的选项,逐一进行判断或计算,从而解决特定的问题。
在C语言中,枚举法尤其适用于需要处理大量数据或进行有限次试验的情况。
本文档将通过几个例题来展示如何使用枚举法进行解题,并提供详细的解题思路。
二、例题及解题思路1. 例题1:求水仙花数水仙花数是指一个n位数(n≥3),其各个位上的数字的n次幂之和等于它本身。
例如,153是一个3位数,且各个位上的数字的3次幂之和等于153(1^3 + 5^3 + 3^3 = 153),因此153是一个水仙花数。
解题思路:* 枚举所有可能的n位数;* 逐一判断该数的各个位上的数字的n次幂之和是否等于该数;* 如果是,则该数为水仙花数,输出该数。
代码实现:```c#include <stdio.h>int main() {int n, num, originalNum = 0;for (n = 3; n >= 0; n--) { // 从3位数开始枚举num = 0;for (int i = 0; i < n; i++) { // 逐位判断num = num * 10 + (rand() % 10); // 生成随机数}num = num * n; // 计算n次幂之和if (num == originalNum) { // 判断是否相等printf("%d是水仙花数\n", num);} else { // 如果不相等,继续下一轮枚举continue;}}return 0;}```2. 例题2:求斐波那契数列前n项和斐波那契数列是一个经典的数学序列,前两项为0和1,之后的每一项都是前两项之和。
例如,斐波那契数列的前几项为:0、1、1、2、3、5、8、13、21...求斐波那契数列前n项的和。
解题思路:* 使用枚举法逐一判断前n项中的每一项;* 根据斐波那契数列的定义,计算每一项的值;* 将所有项的值相加得到总和。
贪心算法几个经典例子c语言1. 零钱兑换问题题目描述:给定一些面额不同的硬币和一个总金额,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。
如果没有任何一种硬币组合能够凑出总金额,返回 -1。
贪心策略:每次选择面额最大的硬币,直到凑出总金额或者无法再选择硬币为止。
C语言代码:int coinChange(int* coins, int coinsSize, int amount){int count = 0;for(int i = coinsSize - 1; i >= 0; i--){while(amount >= coins[i]){amount -= coins[i];count++;}}return amount == 0 ? count : -1;}2. 活动选择问题题目描述:有 n 个活动,每个活动都有一个开始时间和结束时间,选择一些活动使得它们不冲突,且能够参加的活动数最多。
贪心策略:每次选择结束时间最早的活动,直到所有活动都被选择或者无法再选择为止。
C语言代码:typedef struct{int start;int end;}Activity;int cmp(const void* a, const void* b){return ((Activity*)a)->end - ((Activity*)b)->end;}int maxActivities(Activity* activities, int n){qsort(activities, n, sizeof(Activity), cmp);int count = 1;int end = activities[0].end;for(int i = 1; i < n; i++){if(activities[i].start >= end){count++;end = activities[i].end;}}return count;}3. 跳跃游戏题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。
信息学奥赛经典算法C语言经典例题100例经典C源程序100例1.【程序1】三位数组合题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++) /*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);} }==============================================================2.【程序2】条件判断题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus); }==============================================================3.【程序3】完全平方数题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
C语言入门必学—10个经典C语言算法C语言是一种广泛使用的编程语言,具有高效、灵活和易学的特点。
它不仅在软件开发中被广泛应用,也是计算机科学专业的必修课。
在学习C语言的过程中,掌握一些经典的算法是非常重要的。
本文将介绍10个经典C语言算法,帮助读者更好地了解和掌握C语言。
一、冒泡排序算法(Bubble Sort)冒泡排序算法是最简单、也是最经典的排序算法之一。
它通过不断比较相邻的元素并交换位置,将最大(或最小)的元素逐渐“冒泡”到数组的最后(或最前)位置。
二、选择排序算法(Selection Sort)选择排序算法是一种简单但低效的排序算法。
它通过不断选择最小(或最大)的元素,并与未排序部分的第一个元素进行交换,将最小(或最大)的元素逐渐交换到数组的前面(或后面)。
三、插入排序算法(Insertion Sort)插入排序算法是一种简单且高效的排序算法。
它通过将数组分为已排序和未排序两个部分,依次将未排序部分的元素插入到已排序部分的合适位置。
四、快速排序算法(Quick Sort)快速排序算法是一种高效的排序算法。
它采用了分治的思想,通过将数组分为较小和较大两部分,并递归地对两部分进行排序,最终达到整个数组有序的目的。
五、归并排序算法(Merge Sort)归并排序算法是一种高效的排序算法。
它采用了分治的思想,将数组一分为二,递归地对两个子数组进行排序,并将结果合并,最终得到有序的数组。
六、二分查找算法(Binary Search)二分查找算法是一种高效的查找算法。
它通过不断将查找范围折半,根据中间元素与目标值的大小关系,缩小查找范围,最终找到目标值所在的位置。
七、递归算法(Recursive Algorithm)递归算法是一种通过自我调用的方式解决问题的算法。
在C语言中,递归算法常用于解决树的遍历、问题分解等情况。
八、斐波那契数列算法(Fibonacci Sequence)斐波那契数列是一列数字,其中每个数字都是前两个数字的和。
一、百钱买百鸡问题(枚举算法)★算法分析:1、对百钱买百鸡问题的所有结果进行逐一统计验证(枚举验证)。
2、公鸡最多只能买20只,母鸡最多只能买33只,小鸡最多只能买300只。
3、用for循环进行逐一验证4、对小鸡的费用应用x/3代替x*(1/3),因为1/3在整型变量下的值为0。
5、需保证小鸡的数量是3的倍数,即x%3==0。
★源代码:图1-1★执行结果:图1-2二、填写运算符问题(枚举算法)★算法分析:1、5个数字需要填入4个运算符。
2、每两个数字之间有4种运算符可以选择。
3、当运算符中填入除号时,右边的被除数不能为0.4、乘除的优先级大于加减的优先级。
5、可以用循环的方法逐一填入各种运算符。
★源代码:图2-1三、汉诺塔问题(递归算法)★算法分析:1、汉诺塔问题可以运用递归算法解决。
2、递归是函数本身调用直接或者间接调用自己的方法。
3、在汉诺塔问题中需要的步骤数是2^n-1。
4、汉诺塔问题步骤解析:(1)把1座上(n-1)个盘子借助3座移动到2座。
(2)把1座上的第n个盘子移动到3座。
(3)把2座上的(n-1)个盘子借助1座移动到3座。
(4)我们假设用h(n,a,b,c)表示把1座n个盘子借助2座移动到3座。
由此可得出结论:(1)上是h(n,1,3,2),(2)上是(n-1,2,1,3)★源代码:图3-1 ★执行结果:图3-2 ★形象示例:A B C图3-3★故事缘由:据说古代有一个梵塔,塔内有3个座A、B、C。
A座上有64个圆盘,盘子大小不等,大的在下,小的在上。
有一个和尚想把这64个盘子从A座移动到C 座,但每次只能移动一个圆盘,并在移动过程中始终保持大盘在下,小盘在上。
在移动过程中只能利用B座。
现在需要写出移动的步骤。
这就是汉诺塔问题。
当时这个和尚觉得很难,于是他想,要是有一个人能把前面的63个圆盘移动到B座,自己再把最后一个圆盘移动到C座,那就简单了。
所以他找了另一个和尚来做这件事。
但是另一个和尚也觉得很难,于是又找来了第三个和尚把B 座上的前62个圆盘移动到A座上,自己再把第63个盘子移动到C座。
一次类推,解决汉诺塔问题,一共有64个和尚参与了这项题目。
即是如此,不难看出,每个和尚所做的事是一样的,这就是说解决汉诺塔问题有一种简单而高效地方法,那就是递归调用。
所谓递归调用,就是函数本身直接或间接的调用自己的方法。
递归算法,也是九大经典算法之一。
但是当时没有那么多和尚来完成这件事,确切的说,只能有他自己一个和尚来完成这件事,于是他想起了一位美国学者所发现的一种非常简单的方法。
首先把3个座排列成品字形,如果圆盘的数字是偶数,就按顺时针方向依次排列成A、B、C。
如果圆盘的数量是奇数是,就按顺时针排列成A、C、B。
开始时按顺时针方向把第1个圆盘从现在的塔上移动到下一个座,当圆盘数目为偶数时,若圆盘在A上,则把它移动到B座。
若圆盘在B座,则把它移动到C座,若圆盘在C座,则把它移动到A座。
接着,把另外两座上可以移动的圆盘移动到新的座上。
最后反复进行上面所述的两个步骤,最后就能完成汉诺塔问题。
其实这种方法很简单,就是按照一定的规则向一个方向移动。
例如当圆盘的数量为3时,其移动方向是A-C、A-B、C-B、A-C、B-A、B-C、A-C。
其实这也是汉诺塔问题的非递归算法。
四、阶乘问题(递归算法)★算法分析:1、阶乘(factorial)是基斯顿·卡曼于1808年发明的运算符号。
2、阶乘可用自身调用自身的递归调用方法解决。
★源代码:图4-1★执行结果:图4-2五、水仙花数问题★算法分析:1、所谓水仙花数,就是一个三位数,其各位数字立方和等于该数本身。
例如153就是一个水仙花数。
2、关于求一个三位数的各个位数的问题。
百位数可以直接用该数除以100解决,因为该数是一个整型变量,其结果也必定是整型数字,即百位数。
同理,十位数可以用先除10在除10取余数的方式解决。
个位数直接除10取余数。
3、关于立方的计算,可以直接三个数相乘,也可以调用cmath库函数进行求解。
★源代码1:图5-1★执行结果1:图5-2图5-3 ★源代码2:图6-1 ★执行结果2:图6-2六、最大公约数与最小公倍数问题★算法分析:1、计算两个数的最大公约数比较简单的方法是从两个数较小的那个数字中开始依次递减,得到的这两个数中第一个公因子即为所求的最大公约数。
2、计算两个数的最小公约数比较简单的方法是从两个数中较大的那个数字开始一次加1,得到的第一个公倍数就是两数的最小公倍数。
3、如果i为a和b的公因数,那么一定满足a%i=0且b%i=0。
所以在算法优化中只需要i从min(a,b)开始依次递减1,,并逐个判断i是不是a和b的公因数,这样得到的第一个公因数就是其最大公约数。
4、最小公倍数的求解与3一致。
5、跳出一重循环可以在循环体判断条件中添加break语句。
★源代码:图7-1★执行结果:图7-2七、哥德巴赫猜想问题★算法分析:1、所谓的哥德巴赫猜想是指每一个大于2的偶数都可以表示成两个素数之和。
我国数学家陈景润曾经作出重要的贡献。
2、不可能对所有偶数进行举例(因为程序必须是有穷的,而偶数是无穷的)。
3、判断一个偶数a是不是可以表示成两个素数的和是本算法的核心。
一个正偶数a一定可以表示成为a/2种正整数相加的形式。
因为a=1+(a-1)=2+(a-2)=3+(a-3)=……a/2+(a-a/2)共a/2种形式。
所以在这a/2种形式中只要有一种满足两数皆是素数时即可证明哥德巴赫猜想的正确性。
★伪代码描述:算法:验证哥德巴赫猜想的正确性输入:一个数ii ?Repeat:If i是素数and a-i是素数Then 设置标志,跳出循环EndifI<-i+1Until i>a/2Else a不满足哥德巴赫猜想End loopEnd★源代码:图8-1 图8-2八、完全数问题★算法分析:1、完全数是满足所有的真因子(除自身外的约数)的和等于它本身。
例如6是完全数,即6=1+2+3。
2、判断完全数,需要找出数的所有约数,约数是所求数能被除尽的所有数。
所以只要找出所有约数即可。
3、完全数的性质:(1)能写成连续自然数之和。
例如6=1+2+3。
(2)全部因数的倒数和为2。
例如1+1/2+3/1+1/6=2。
(3)除6以外的完全数能表示成连续奇次方立方之和。
例如28=1^3+3^3。
(4)可以表示成2的一些连续正整次幂之和。
例如28 = 2^2 +2^3+2^4。
(5)完全数全部以6或8结尾。
(6)除6以外的完全数,把它的各个位数相加,直到变成个位数,那么这个个位数一定是1。
即除6以外的完全数,被9除后都是余1。
例如496,4+9+6=19,1+9=10,1+0=1。
(7)数学家欧几里得推算出来的完全数获得公式:如果2^p-1为质数,那么(2^p-1)×2^(p-1)就是一个完全数。
当2^p-1是质数时,称梅森素数。
★源代码:★执行结果:图9-2九、素数问题★算法分析:1、素数又称质数,是指除了1及其本身之外没有任何约数的数。
2、比1大但还不是质数的称为合数。
3、0和1既不是素数也不是合数。
★源代码1:图10-1 ★执行结果1:图10-2 ★源代码2:图12-1 ★执行结果2:图12-2十、一元二次方程问题★算法分析:1、一元二次方程寻找解的方法可以用公式法。
2、用判别式判断解集的情况。
3、用if else 语句实现其分支判断。
★源代码:图11-1★执行结果:图11-2图11-3十一、学生管理系统(结构体编程)★算法分析:1、学生管理系统需要利用结构体对学生的数据进行输入和存储。
2、本题主要是用于考擦对结构体的熟练程度。
3、需要用排序对学生的成绩进行排序。
本例子利用冒泡排序法进行排序。
★源代码:图13-1 ★执行结果:图13-2十二、冒泡排序问题★算法分析:1、所谓冒泡排序法,就是利用比较相邻的两个数字的大小并对其进行大小的排序。
2、对一组数据进行冒泡排序,可以利用二重循环进行比较。
一重循环用来决定所要两两比较的次数,二重循环用来进行两两之间的比较。
如果是升序排序,那么在两两比较的时候把大的数字放在小的数字后面,如果是降序排序,与升序排序相反。
★源代码1:图14-1 ★执行结果1:图14-2★源代码2:图15-1★执行结果2:图15-2十三、选择排序问题★算法分析:1、选择排序算法是排序的经典算法之一,其运行效率与冒泡排序相当。
2、选择排序的算法思路:(1)输入n个数据,标记第一个为最小值。
(2)第一趟,所标记最小值与后面的数据进行逐一比较,如果最小值大于所比较数据,那么该数据和最小值数据进行对调位置。
(3)第二趟,最小值的标记位置往下一个位置移动。
(4)重复进行上述(1)-(3)的操作。
★源代码:图16-1★执行结果:图16-2十四、直接插入排序问题★算法分析:1、直接插入排序是一种最直接的插入排序方法,能够将第n个记录插入到前面n-1个已排好的原始序列记录中。
2、实现步骤:将第n个数据与前面的所有数据进行比较,将所有原始数据后移一个位置,直到遇到小于或等于第n个的数据m,此时m后面一定是空位置,将第n个数据插入到该空位置上即可。
★源代码:图17-1图17-2十五、树形选择排序问题★算法分析:1、树形选择排序也称为锦标赛排序。
2、树形选择排序的算法思路:(1)两两比较待排序的n个记录的关键字,并取出较小者。
(2)在n/2个较小者中采用同样的方法比较选出每两个中的较小者。
(3)重复上述动作,知道选出最小关键字的记录为止。
3、树形排序的解决方法:我们可以用一棵有n个结点的树来选出的最小关键字记录的结点就是这棵树的根结点。
当输出最小关键字以后,为了选出次小关键字,可以将设置结点即最小关键字所对应的叶子结点的关键字值设为正无穷,然后再进行上述过程,直至所有的记录全部输出为止。
十六、平方根问题(迭代算法)★算法分析:1、求平方根的迭代公式:x1=1/2×(x0+a/x0)。
2、也可以直接调用cmath函数库进行求解。
★源代码1:图18-1 ★执行结果1:图18-2图18-3★源代码2:图19-1 ★执行结果2:图19-2图19-3十七、创建链表问题★算法分析:1、链表是一种不同于数组的的新的数据存储结构。
2、链表包含了头结点、头指针、尾结点、尾指针。
链表只需要一个变量,即头指针即可确定一个链表。
3、定义一个链表可以使用结构体进行定义。
★源代码:图20-1十八、八皇后问题(试探算法)★算法分析:1、八皇后问题是一个古老而著名的问题,是典型的试探算法的例子。
所谓的八皇后问题,是由19世纪数学家高斯于1850年手工解决:在8*8格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后不能处于同一行、同一列或同一斜线上,问总共有多少种解决方法。