数组是存放一组相同元素的集合,数组分为一维数组和二维数组,接下来就让我们进行数组的学习,我们先来看一段代码。
#include <iostream>
using namespace std;
int main()
{
int arr[5]={1,2,3,4,5}; //创建了一个数组,它里面包含了五个整型变量
int arr1[]={1,2,3,4,5};
return 0;
}
以上是数组的简单使用,来存放类型相同的数据,对于存放数据的数组,它自然会有存放不下和越界的问题。对于数组来说它在内存中是连续存放的,而且和现实中不同,数组是有下标的,对于第一个元素它的下标是0,因为有了下标所以要访问数组就不要越界访问。
知道了越界的知识后我们要对数组进行遍历,把它们打印在屏幕上。还要对它们进行逆序打印。
#include <iostream>
using namespace std;
int main()
{
//对数组进行遍历输出
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
cout<<arr[i]<<endl;
}
//对数组进行逆序打印
for(int j=sizeof(arr)/sizeof(arr[0])-1;j>=0;j++)
{
cout<<arr[j]<<endl;
}
return 0;
}
以上的代码用到了sizeof,它本身是计算数据类型所占内存的大小,用它就可以计算数组中有几个元素,下面的二维数组也会用到。说完了这个接下来我们来讲数组名的作用,以及它们的内存图示。
数组名其实是首元素的地址,其他元素按照数据类型往下依次存储,但是其中有两个特例,一个是sizeof(数组名)它表示的是整个数组的大小,第二个&数组名,它表示的是取出整个数组的地址。其他的情况出现的数组名均是首元素的地址。
接下来我们来看二维数组,二维数组也可以理解为几个一维数组的组合,比如一个三行四列的二维数据就可以理解为三个一维数组,一维数组中存放了四个元素,把它们和在一个就是二维数组。
#include <iostream>
using namespace std;
int main()
{
int arr[][4] = { 1,2,3,4,5,6,7 };
int arr1[3][4] = { 1,2,3,4,5,6,7 };
int arr2[3][4] = { {1,2},{2,4},{4,5} };
return 0;
}
以上的二维数组的创建都是正确的,但是二维数组创建可以省略行但是不能省略列,这个需要引起注意。那么如何通过sizeof来计算行数和列数呢。
#include <iostream>
using namespace std;
int main()
{
int arr[3][4] = { 1,2,3,4,5,6,7 };
cout << sizeof(arr) / sizeof(arr[0]) << endl;
cout << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
return 0;
}
看完了一维数组的数组名,你是否对二维数组的数组名有一定的理解呢,对于一维数组它的数组名是首元素的地址,对于二维数组的数组名它也表示首元素的地址,对它们进行加一的操作会发生什么呢。
学完了数组的基本知识后,要介绍两个算法,一个是二分查找,一个是冒泡排序,学习完这两个算法会对你的数组认识更加熟练。什么是二分查找呢,它有个前提条件那就是数组中的数字是从小到大排列好的,有了这个前提我们再来说什么是二分查找。假若一个数组有十万个数字排列好从小到大,其中有一个目标数字,你要在十万个数字中找到它,若是按照传统的方法一个一个找,未免太想费时间,运用二分查找会使时间大大减少,提升运行效率。二分查找核心是如何对数组的下标进行熟练的应用。
以上是思路接下来我们来看代码的实现。
#include <iostream>
using namespace std;
int binary_search(int arr[],int flag,int start,int end)
{
while (start <= end)
{
int midest = start + (end - start) / 2;
if (flag > arr[midest])
{
start = midest + 1;
}
else if (flag < arr[midest])
{
end = midest - 1;
}
else
{
return midest;
}
}
return -1;
}
int main()
{
int arr[] = { 2,4,5,7,9,45,56,76,88,99,222,444,667,777,890,996,1111 };
int flag = 111;
int start = 0;
int end = sizeof(arr) / sizeof(arr[0]) - 1;
int ret = binary_search(arr, flag, start ,end);
if (ret != -1)
{
cout << "找到了"<<"它在数组中的位置是"<< ret;
}
else
{
cout << "没找到";
}
return 0;
}
冒泡排序的核心思想是两两进行比较,在一趟趟的比较中对数组进行升序或者降序排列。对于冒泡排序来说最关键的是两次for循环中的变量的条件设置,第一层循环的条件设置是一共有几个元素就排序几个元素减一躺,第二层循环是具体提到每一趟循环排序几次的问题。
#include <iostream>
using namespace std;
void bubbles_sort(int arr[], int sz)
{
for (int i = 0; i < sz - 1; i++)
{
for (int j = 0; j < sz - 1 - i; j++)
{
if (arr[j]>arr[j+1])
{
int tmp = 0;
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[] = {1,34,56,23,44,21};
int sz = sizeof(arr) / sizeof(arr[0]);
bubbles_sort(arr,sz);
for (int i = 0; i < sz; i++)
{
cout << arr[i] << endl;
}
return 0;
}