零基础快速掌握——【c语言基础】数组的操作,冒泡排序,选择排序
1.数组
内存空间连续:
2.定义格式
数组的定义格式:
数组分为一维数组、二维数组、以及多维数组,不同类型的数组定义格式时不一样
2.1 一维数组的定义
数据类型 数组名 [数组长度];
解释:
数据类型:表示数组每一个成员的类型
数组名:随便起,符合标识符命名规则即可
数组长度:这个数组有几个成员,可以是一个整型值,也可以是一个常量表达式
ex:
int arr[100]; //arr数组可以保存100个int类型的成员
char arr1[10]; //arr1数组可以保存10个char类型的成员
2.2 二维数组的定义
数据类型 数组名 [长度1] [长度2];
解释:
二维数组保存的成员个数是长度1*长度2
int arr[3][2];/定义了一个二维数组,可以保存6个int类型的成员
2.3 数组定义注意事项
数组的名字是一个指针常量,数组名就代表数组空间的首地址
3.一维数组成员的访问
4.数组成员的初始化
4.1 全部初始化
在定义数组时为数组的每一个成员都进行赋值
数组类型 数组名[长度]={数值1,数值2,数值3.。。}
4.2 部分初始化
定义数组时初始化其中前几个成员的数值,其他的成员不进行赋值.
当进行数组部分初始化时,没初始化的数组成员数值为0
4.3 数组特殊定义并初始化形式
数据类型 数组名[]={数值1,数值2,数值3,数值4.。。}
如果定义数组时在中括号中不加数组长度,直接对数组进行初始化,
那么数组的长度由后面初始化的数值个数决定
5.整型数组的一些常见操作
5.1 长度/均值/最值/逆序
5.2. 数组成员的查找
所谓数组成员的查找就是我们给一个要查找的值,在数组中查询这个值所在的位置
数组成员的查找方式分为存在型查找还有统计型查找:
5.2.1 存在型查找:
在数组中找到这个数值后就停止查找,不关注后面还有没有
5.2.2 统计型查找:
遍历整个数组,找到所有要查找到的数值
6.一维整型数组的排序
所谓排序指的是将大小不一的数组成员按照升序或者降序的形式进行重新组合
6.1 冒泡排序
概念以及规律
在进行排序时从数组第一个位置开始让相邻两个成员进行比较,比较完毕后比较大的数据换到后面去,循环进行
解释:
如上图:我们有15个数组成员,那么我们需要比较15轮
第一轮:进行14次相邻成员的比较并进行交换,选择最大的数值放在最后一个位置
第二轮:进行13次相邻成员的比较并进行交换,选择第二大的数值放在倒数第二个位置
第三轮:进行12次相邻成员的比较并进行交换,选择第三大的数值放在倒数第三个位置
.....
根据上面的规律,我们想要进行比较,需要设置内外两层循环:
外层循环:用来标识比较的轮数,其实数组有几个成员就比较几轮
内层循环:用来标识本轮比较的次数,并循环内进行比较和交换
include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{int a[10];int i,t,j;int n=sizeof(a)/sizeof(int);for (i=0;i<n;i++){scanf("%d",&a[i]);}//10个比较9次for (i=0;i<n-1;i++){ //共执行n-1趟for(j=0;j<n-1-i;j++){if(a[j]>a[j+1]){ //冒泡排序 两两比较交t=a[j]; // 1 2 3 4 5 6 7 8 9 10 na[j]=a[j+1]; // 0 1 2 3 4 5 6 7 8 9 ia[j+1]=t; // 0 1 n-1-1 n-1} // n-1-i}}for (i=0;i<n;i++){printf ("%d ",a[i]);}return 0;
}
6.2 简单选择排序
原理以及规律:
默认选择数组第一个成员为最大值,让最大值和数组后面每一个成员进行大小比较,我们定义一个变量用于保存最大值成员的下标,比较完毕后确定最大值下标,将最大值和数组第一个成员进行数据交换。以此往复,再确定第二大、第三大。。。
选择出最小的值放到最小的位置
1> 选择排序是指,在剩余序列中,找到最大值(最小值),将其与待排序序列的第一个进行交换
2> 原理
1、从待排序序列中找到最值,将其标记
2、将标记后的最值跟待排序序列的第一个元素进行比较,如果不是待排序序列的第一个,则进行交换
3、从剩余序列中,重复前两步骤,直到待排序序列为空,则排序结束
解释:
如上图,总共有15个成员,我们要进行比较15轮
第一轮:
默认0下标位置数值最小,通过循环,让最小值和数组每一个成员进行比较,如果还有 比我们认为的最小值还小的成员,那么就改变最小值下标为当前成员下标
第一轮我们需要比较14次,一轮结束后,将最小成员和数组0位置成员进行数据交换
第二轮:假设1位置数据最小,将最小和后面成员进行比较,确定最小成员下标,将最小成 员和1位置进行交换
.......
根据上面的分析,我们需要比较若干轮,每一轮确定出升序成员中最小(最大值)
每一轮需要比较若干次
所以我们需要使用内外两层循环:
外层循环:设置我们比较的轮数,一轮结束后进行数值交换
内存循环:设置这一轮比较的次数,确定出最小(最大)数值的下标
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{int arr[]={1,2,3,4,5,6,7,8,9,4,5,6,6,7,7,9};int len=sizeof(arr)/sizeof(int);int i ,j;int temp;int min;for (i=0;i<len;i++){min=i;for (j=i+1;j<len;j++){if (arr[min]>arr[j]){min=j;}}temp=arr[i];arr[i]=arr[min];arr[min]=temp;}for (i=0;i<len;i++){printf("%d",arr[i]);}putchar(10);return 0;
}
二维数组→零基础快速掌握——c语言基础【二维数组】-CSDN博客
练习:
一个小组有六名学生,要求定义一个数组存储该六名学生的成绩,完成对这些学生成绩的录入
输出所有学生分数 。输出最大值,最小值,平均分,总合,逆序排列。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{int a[6];int i,max=0,min=0,sum=0,ave=0;int n=sizeof(a)/sizeof(int);int t;//逆序交换的中间变量printf("n=%d",n);for (i=0;i<n;i++){scanf("%d",&a[i]); //输入6个成绩}for (i=0;i<n;i++){printf("学生%d:%d ",i+1,a[i]);printf("\n");}for (i=0;i<n;i++){sum+=a[i]; //求和ave=sum/n; //求平均值} //初始max=0for (i=1;i<n;i++){ //打擂台法,求最大最小值if (a[max]<a[i]){max=i;}if (a[min]>a[i]){min=i;}}printf("max=%d ",a[max]);printf("min=%d ",a[min]);printf("sum=%d ",sum);printf("ave=%d ",ave);for (i=0;i<n/2;i++){ //逆序排列 n/2交换次数t=a[i];a[i]=a[n-1-i]; a[n-1-i]=t;}for(i=0;i<n;i++){ //逆序输出printf("%d",a[i]);}return 0;
}