c++基础知识第六天:数组(冒泡排序)

一、数组

1、定义:就是一个集合,里面存放了相同类型的元素

2:特点:每个元素数据类型相同;数组由连续的内存位置组成

3、作用:打包数据,便于取用和管理

二、一维数组

1、定义方式:数据类型 数组名[数组长度];

                       数据类型  数组名[数组长度]={值1,值2......}     常用,不易出错

                        数据类型  数组名[]={值1,值2......}

 注意:索引下标从0开始,初始未写元素必须定义数组长度(否则未定义);若写了可以不用定义长度,定义了长度但是元素未写全则默认为0,没定义根据有多少元素长度默认为多少。

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 10,20,30,40,50 };
	//利用循环输出数组中的元素
	for (int i = 0; i < 5; i++)//5代表个数
	{
		cout << arr[i] << " ";
	}
}

 若没有赋值完全,后几个元素由零补充

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 10,20,30 };
	//利用循环输出数组中的元素
	for (int i = 0; i < 5; i++)//5代表个数
	{
		cout << arr[i] << " ";
	}
}

2、数组名的作用

1)统计整个数组内存中的长度  sizeof()

2)获取数组在内存中的首地址

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 10,20,30,40,50 };
	cout <<"整个数组所占内存大小"<<sizeof(arr) << endl;//整个数组的内存大小
	cout << "数组中第一个元素所占内存大小"<<sizeof(arr[0]) << endl;//某个元素的内存大小
	cout << "元素个数" << sizeof(arr) / sizeof(arr[0]) << endl;//根据上述结果得到元素个数(第三种定义方式时方便查看)

	cout << "数组内存地址"<<arr << endl;//打印数组内存首地址
	cout << "数组第一个元素的地址为:" << &arr[0] << endl;
}

运行结果:

 注意:数组的首地址与数组中第一个元素位置重合。由于定义为int型,第二个元素地址与第一个元素地址差4个字节。数组名是常量,不可以进行赋值操作,eg:arr=100不可以。

3、案例:五只小猪称体重,打印最重的小猪体重

思路:用数组定义五只小猪体重;用if语句比较小猪的体重(数组中取出元素)得到最重的。

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 100,200,350,260,130 };
	if (arr[0] > arr[1])
	{
		if (arr[0] > arr[2])
		{
			if (arr[0] > arr[3])
			{
				if (arr[0] > arr[4])
				{
					cout << "最重的小猪重量" << arr[0] << endl;
				}
			}
		}
	}
	else 
	{
		if (arr[1] > arr[2])
		{
			if (arr[1] > arr[3])
			{
				if (arr[1] > arr[4])
				{
					cout << "最重的小猪重量" << arr[1] << endl;
				}
			}
		}
		else
		{
			if (arr[2] > arr[3])
			{
				if (arr[2] > arr[4])
				{
					cout << "最重的小猪重量" << arr[2]<<endl;
				}
			}
			else
			{
				if (arr[3] > arr[4])
				{
					cout << "最重的小猪重量" << arr[3] << endl;
				}
				else
				{
					cout << "最重的小猪重量" << arr[4] << endl;
				}
			}
		}
	}

	
}

上述复杂了

优化:定义最大值,取一元素与最大值比较,更新最大值;将剩下元素与最大值比较然后更新最大值,最终的最大值几位最重小猪体重。

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 100,200,350,260,130 };
	int max = 0;//先认定一个最大值
	for (int i = 0; i < 5; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
	}
	cout << "最重小猪体重" << max << endl;
	
}

2)数组元素逆置

#include<iostream>
using namespace std;
int main()
{
	int arr[] = { 10,20,30,40,50,130,450,23,13,3,54};
	int num;
	int b;//创建临时内存,实现互换
	num = sizeof(arr) / sizeof(arr[0]);//数组的个数
	if (num / 2 == 0)
	{
		for (int i = 0; i < num / 2; i++)
		{
			b = arr[i];
			arr[i] = arr[(num - 1) - i];//num-1为末尾下标
			arr[(num - 1) - i] = b;
		}
		for (int j = 0; j < num ; j++)
		{
			cout << arr[j]<<" ";
		}
	}
	else
	{
		for (int i = 0; i < (num - 1) / 2; i++)
		{
			b = arr[i];
			arr[i]=arr[(num - 1) - i];
			arr[(num - 1) - i] = b;
		}
		for (int j = 0; j < num ; j++)
		{
			cout << arr[j]<<" ";
		}
	}
}

以上为我写,导致任意数组。

视频中,老师的优化

#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int start = 0;//起始下标
	int end = sizeof(arr) / sizeof((arr[0]))-1;//结束下标
	while (start < end)
	{
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;//实现元素互换
		start++;
		end--;
	}
	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << " ";
	}
}

 3)冒泡排序*****

1、比较相邻的元素,如果第一个比第二个大,就交换他们

2、对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值

3、重复以上步骤,每次比较次数-1,直到不需要比较

 

#include<iostream>
using namespace std;
int main()
{
	int arr[] = {1,15,8,90,23,34,12,3,4};
	int num;
	num = sizeof(arr) / sizeof(arr[0]);
	int temp ;
	for (int i = 0; i < num-1;  i++)
	{
		for (int j = 0; j < num - i-1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp; 
			}
		}
	}
	for (int k = 0; k < num; k++)
	{
		cout << arr[k] << " ";
	}	
}

遇到的错误:j < num - i-1写成了num-i,程序运行不了。原因:下标从0开始,当循环条件是<没有=时,循环次数就是下标数字。上述程序若写成num-i,那么第一轮,就会循环0-8即9次,而我们只需要循环8次,相邻元素比较。

注意:下标和元素个数的关系。下标是从0开始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值