初始数组

本文深入解析数组概念,涵盖数组定义、基本使用、常见操作,如求和、求平均分、查找最大最小值及排序技巧。通过实例展示数组在实际编程中的运用,适合初学者快速掌握数组操作。

数组 【初时堆的概念】
变量的数据类型
基本数据类型 byte short int long float double char boolean
引用数据类型 数组、类(String是类的一种)、接口、枚举…

  1. 理解数组的作用
    变量在使用时它只能使用基本数据类型,存储值只能存储简单的数据/单一的数据如果想同时存储更多的数据,它无法实现,同样关于变量的操作比较简单,我们需要寻找一种能够同时存储更多数据的,并且操作更加丰富的数据类型。

  2. 掌握数组的定义
    数组 一组数据 数据的组合体
    有限的相同类型的变量的组合 就被称为数组
    数组中的变量又被称为分量或者元素
    数组是一种引用数据类型 他的数据是储存在JVM(虚拟机)中的堆中的 基本数据类型一般都是储存在 栈 中的

  3. 掌握数组的基本使用
    与变量组成基本相同
    变量是由 数据类型 变量名 变量值组成的
    数据类型 变量名
    变量名 = 变量值
    数据类型 变量名 = 变量值
    数组也是由 数据类型(还是那些基本数据类型) 数组名(也就是变量名) 数组长度(里面有多少个变量) 数组元素(元素=变量 有多少个变量)
    数组的长度一旦定义就不能更改了
    数组元素(变量)不赋值也有初始值
    byte short int long :0 float double:0.0 boolean:false char:\U0000 一个空格 String等引用数据类型默认值为 null (表示没有引用)
    数组的下标(索引)
    数据类型[] 数组名 = new 数据类型[数组长度] 数据类型[] 数组名 = {元素1,元素2,元素3,…}

获取数组中的所有数据也可以被称为遍历数组(遍历)
for(int i = 0; i < 数组名.length; i++) {
System.out.println(scores[i]);
}

增强for循环(foreach) 迭代器
for(数据类型 数组名:数组名s){
System.out.print(数组名);
}
4. 掌握数组的常用操作
(1)求一个班的成绩总和与平均分
Scanner input = new Scanner(System.in);
// 存储班级成绩(利用数组)
double[] scores = new double[5];
for(int i = 0; i < scores.length; i++) {
System.out.print(“请输入第”+(i+1)+“名同学的成绩:”);
scores[i] = input.nextDouble();
}

// 对班级成绩进行计算求和 求平均分
// 遍历数组 将所有成绩进行累加
double sum = 0;
for(double score : scores) {
// 累加求和
sum += score;
}

// 平均分
double avg = sum / scores.length;
System.out.println(“班级的总成绩为:”+sum);
System.out.println(“班级的平均分为:”+avg);

(2)求最大/小值
使用键盘录入输入5位学生的成绩,然后计算最高分和最低分
Scanner input = new Scanner(System.in);

// 存储成绩
double[] scores = new double[5];
for(int i = 0; i < scores.length; i++) {
System.out.print(“请输入第”+(i+1)+“位学生成绩:”);
scores[i] = input.nextDouble();
}

// 计算最高分 90 98 70 60 10
// 打擂台 找一个守擂的
double max = scores[0]; // 我认为最强的
double min = scores[0];
for(int i = 1; i < scores.length; i++) {
// 打擂台比较 只要发现有比最大值还大的
if(max < scores[i]) {
// 更换变量的值
max = scores[i];
}
if(min > scores[i]) {
min = scores[i];
}
}
System.out.println(“最高分:”+max);
System.out.println(“最低分:”+min);

(3)通过数组进行排序-插入新值保持顺序
// 存储学员成绩
int[] scores = {99,85,82,63,60,0};

// 输入一个新成绩
Scanner input = new Scanner(System.in);
System.out.print(“请输入要插入的成绩:”);
int num = input.nextInt();

// 将它插入成绩序列,并保持降序
// 1.找到可以插入的位置
// 遍历数组 查找是否有比输入的数值小的元素(降序)
int i = 0;
for(; i < scores.length; i++) {
if(num > scores[i]) {
// 扎到要插入的位置 就可以停下来了
break;
}
}
System.out.println(“新成绩未来插入的位置是:”+i);

// 2.插入新值
// 移位 从后往前 将数值进行后移
for(int j = scores.length - 1; j > i; j–) {
scores[j] = scores[j-1];
}
// 将新值进行赋值
scores[i] = num;
System.out.println(“插入新值之后的结果为:”+Arrays.toString(scores));

(4)猜数游戏
// 存储数列的数据
int[] nums = {8,4,2,1,23,344,12};
// 1.循环输出数列的所有值
for(int num : nums) {
System.out.print(num+" “);
}
System.out.println(”\n-------------------------");
// 2.求数列中所有数值的和
int sum = 0;
for(int num : nums) {
// 累加求和
sum += num;
}
System.out.println(“数列的和为:”+sum);
System.out.println("-------------------------");
// 3.猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数
Scanner input = new Scanner(System.in);
System.out.println(“请输入一个整数:”);
int inputNum = input.nextInt();
// 遍历数组 查看是否有相同的数值
// 设立标记(日后一个比较不错的思路方案)
// int / boolean
boolean flag = false; // 假定不存在此值

for(int num : nums) {
if(inputNum == num) {
flag = true; // 更改标记
break;
}
}

// 判断标记
if(flag) {
System.out.println(“包含此值!”);
}else {
System.out.println(“不包含此值!”);
}

### 循环队列初始数组空间的选择方法 在设计循环队列时,初始数组空间大小的选择是一个关键问题。以下是关于如何选择初始数组空间的一些考虑因素和建议: #### 1. 确定最大可能的元素数量 在实际应用中,循环队列通常用于存储一定范围内的数据元素。因此,在创建循环队列之前,可以根据应用场景预估可能的最大元素数量 $ N $,并将数组大小设置为至少 $ N+1 $。这是因为循环队列需要保留一个空闲位置来区分队列满和队列空的状态[^1]。 #### 2. 考虑额外的空间开销 为了提高空间利用率,循环队列可以通过模运算实现指针的循环移动。然而,如果数组大小过小,则可能导致频繁的扩容操作,从而增加时间复杂度。因此,建议选择一个稍微大于预估最大元素数量的值作为初始数组大小。例如,可以选择 $ 2N $ 或 $ 3N $ 的大小[^4]。 #### 3. 使用固定大小或动态扩展 - **固定大小**:如果应用场景对内存使用有严格限制,可以选择固定大小的数组。此时,数组大小应根据系统资源和需求进行精确计算。 - **动态扩展**:如果允许动态扩展,则可以在初始化时选择一个较小的数组大小(如 10 或 16),并在队列接近满时通过复制到更大的数组来扩展空间[^3]。 #### 4. 数组大小的幂次优化 在某些情况下,将数组大小设置为 2 的幂次(如 8、16、32 等)可以优化模运算的性能。因为模运算 $ x \% y $ 在 $ y $ 是 2 的幂次时可以被位运算 $ x \& (y - 1) $ 替代,从而提高运行效率[^2]。 #### 示例代码 以下是一个简单的循环队列初始化代码示例,展示了如何选择初始数组空间: ```c #define INITIAL_SIZE 16 // 初始数组大小 typedef struct MyCircularQueue { int* data; int front; int rear; int capacity; // 队列容量 } MyCircularQueue; MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue* queue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); queue->data = (int*)malloc(sizeof(int) * (k + 1)); // 多留一个位置 queue->front = 0; queue->rear = 0; queue->capacity = k + 1; // 实际容量比用户指定的大1 return queue; } ``` ### 总结 选择循环队列初始数组空间时,需要综合考虑最大可能的元素数量、空间开销、是否允许动态扩展以及性能优化等因素。一般建议将数组大小设置为预估最大元素数量的 1.5 倍至 2 倍,并尽量选择 2 的幂次以优化模运算性能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值