数组是存放一组相同元素的集合,数组分为一维数组和二维数组,接下来就让我们进行数组的学习,我们先来看一段代码。

#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,因为有了下标所以要访问数组就不要越界访问。

C++教程——初识c++(数组,二分查找,冒泡排序)_数组

知道了越界的知识后我们要对数组进行遍历,把它们打印在屏幕上。还要对它们进行逆序打印。

#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(数组名)它表示的是整个数组的大小,第二个&数组名,它表示的是取出整个数组的地址。其他的情况出现的数组名均是首元素的地址。

C++教程——初识c++(数组,二分查找,冒泡排序)_数组_02

C++教程——初识c++(数组,二分查找,冒泡排序)_数组名_03

接下来我们来看二维数组,二维数组也可以理解为几个一维数组的组合,比如一个三行四列的二维数据就可以理解为三个一维数组,一维数组中存放了四个元素,把它们和在一个就是二维数组。

#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;
}


C++教程——初识c++(数组,二分查找,冒泡排序)_二维数组_04

看完了一维数组的数组名,你是否对二维数组的数组名有一定的理解呢,对于一维数组它的数组名是首元素的地址,对于二维数组的数组名它也表示首元素的地址,对它们进行加一的操作会发生什么呢。

C++教程——初识c++(数组,二分查找,冒泡排序)_二维数组_05

学完了数组的基本知识后,要介绍两个算法,一个是二分查找,一个是冒泡排序,学习完这两个算法会对你的数组认识更加熟练。什么是二分查找呢,它有个前提条件那就是数组中的数字是从小到大排列好的,有了这个前提我们再来说什么是二分查找。假若一个数组有十万个数字排列好从小到大,其中有一个目标数字,你要在十万个数字中找到它,若是按照传统的方法一个一个找,未免太想费时间,运用二分查找会使时间大大减少,提升运行效率。二分查找核心是如何对数组的下标进行熟练的应用。

C++教程——初识c++(数组,二分查找,冒泡排序)_二维数组_06

以上是思路接下来我们来看代码的实现。

#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循环中的变量的条件设置,第一层循环的条件设置是一共有几个元素就排序几个元素减一躺,第二层循环是具体提到每一趟循环排序几次的问题。

C++教程——初识c++(数组,二分查找,冒泡排序)_数组_07

#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;
}