C语言入门8-数组-基本算法
一、 什么是数组
数组就是具有相同数据类型的有序集合。
分为一维数组、二维数组及多维数组。
一维数组就是用一个下标定义的数组
二维数组就是用二个下标定义的数组
我们把具有三个下标及三个下标以上的数组称为多维数组。
二、 数组
- 1. 一维数组的定义
(1) 一维数组的定义的形式始下:
类型说明符 数组名[常量表达式];
Int a [10];
定义数组时,数组的大小必须确定
(2) 对于一维数组的定义说明如下:
数组名应符合标识符的命名规则,正式应用中第一个字符应为英文
用方括号将常量表达式括起来
常量表达式定义了数组元素的个数
数组下标从0开始。如果定义5个元素,是从第0个元素至第4个元素。
常量表达式中不允许出现变量。
- 2. 数组的初始化
(1) 对数组元素赋初始化可以用以下方法实现
① 在定义数组时对数组元素赋以初值。
② 可以只给一部分元素赋值:例始
int a[10]={1,2,3,4};在语句只给了前4个元素初值,后面6个默认以0补齐
③ 如果想一个数组里的全部元素值为0;可以写成
int a[10]={0};或int a[10]={0,0,0,0,0,0,0,0,0,0};
④ 在数组赋初值时可以不指定长度,长度默认就是后面元素的个数:
例 int a[]={1,2,2,3,4};数组默认长度为4.
整型数组排序
一、 什么是排序
排序是计算机内经常进行的一种操作,
其目的是将一组"无序"的记录序列调整为"有序"的记录序列。
二、 排序的方法
排序的方法有很多:快速排序、希尔排序、堆排序、直接选择排序,基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序。
排序是一个基本功,这里先介绍一种最简单和实用的方法:冒泡排序法。
- 1. 冒泡排序法
现在给大家一个来思考,给你10个质量不同的塑料小球,让你从轻到重依次分开,不用能用称重的方法解决,你能想到用什么办法吗?
冒泡排序(BubbleSort)的基本概念是:
依次比较相邻的两个数,将小数放在前面,·大数放在后面。
即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,
如此继续,直至比较最后两个数,将小数放前,大数放后。
- 2. 冒泡排序的算法设计原理
冒泡排序算法的运作如下:(从后往前)
(1) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3) 针对所有的元素重复以上的步骤,除了最后一个。
(4) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
(1) 参考代码如下:
/* 从低到高排序 */
#include "stdio.h"
void main()
{ int a[6] = { 6, 2, 4, 1, 5, 9 };
int t;
int i,j; // i是外层循环 j是内层循环
for (i = 1; i < 6; i++)
{
for (j = 0; j <6-i ; j++)
{
if (a[j] > a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
printf("从低到高依次为\n");
for(i=0;i<6;i++)
printf("%d\t",a[i]);
}
算法—穷举的实现
一、 穷举
穷举法(Exhaustion),也称枚举法(Enumeration):列举所有可能,逐一试探 。
1、穷举法的基本思想:
根据问题的 部分已知条件 预估 解的范围
在此范围内 对所有可能的情况 进行逐一验证
2、若某个情况符合题目的全部条件,则该情况为本问题的一个解
若全部情况的验证结果均不符合题目的全部条件,则说明该题无解
直到找到满足已知条件的解为止
3、穷举法 求解问题的 两个基本要素 (多选题 )
(1)确定穷举对象和穷举范围
影响算法的时间复杂度、 循环结构实现
(2)确定判定条件
符合什么条件 才能 成为问题的答案、分支结构实现
4、穷举法的实际应用,常用于密码的破译 , 也称蛮力法(Brute Force),或暴力搜索法
(1)穷举法优点:算法简单,逻辑清晰,易于理解,程序易于实现
(2)缺点:运算量较大、只适合于“有几种组合”、“是否存在”、求解不定方程 等类型的问题求解
二、 鸡兔同笼 参考代码如下:
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { int i;// 鸡的只数 for(i=1; i<98; i++) { if(2*i+(98-i)*4==386) { printf("鸡%d头\n兔%d只\n",i,98-i) ; } } }
三、 ACM案例28水仙花数
水仙花数定义 各个位数立方和等于它本身的三位数。
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { int num;//定义数变量 int g,s,b;//定义个、十、百位变量名 printf("水仙共数有:"); for(num=100;num<=999;num++)//穷举测试 { g=num%10; //个位数 s=num/10%10; //十位数 b=num/100; //百位数 if(g*g*g+s*s*s+b*b*b==num) //判断条件 { printf("%d\t",num); } } }