概述
1.数组的优缺点:
占据一块连续的内存,指定数组的大小,根据大小分配内存大小。
因为数组是连续存储的,所以对于数组的查找和读写,时间效率较高。但又因为数组是连续存放的,内存分配容易造成浪费,空间效率不高
2.数组与指针的关系
先看代码:
#include <iostream>
using namespace std;
int GetSize(int data[])
{
return sizeof(data);
}
int main()
{
int data1[] = { 1,2,3,4,5 };
int size1 = sizeof(data1);
int* data2 = data1;
int size2 = sizeof(data2);
int size3 = GetSize(data1);
printf("%d, %d, %dn", size1, size2, size3);
system("pause");
return 0;
}
运行结果为:
从中我们可以看出来,size1为20,是data1数组的大小,data1有5个元素,每个元素占4个字节,所以整个数组的大小为20;size2为4是什么原因呢,是因为数组名也是一个指针,指向数组第一个元素,所以我们也可以定义指针来访问数组,但不能超越数组大小。指针data2指向数组data1,也就是指向数组的第一个元素(1),因为指针data2也是int型,在32位运算模式下,所以sizeof(data2)为4(指针的大小只会跟运算模式的位数有关,与指向数据的类型无关,不管是char、int、float、double,32位下指针大小都是4字节,64位下为8字节);而size3也为4,就说明了,函数之间传递的也是指针,GetSize函数里面的参数data,也是作为指针处理的,所以size3也是4
3.算法实列
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。数组如下,查找数组中是否包含整数7
算法思想:从右边开始看第一列(9,12,13,15),我们发现这一列中的第一个数字9大于7,便没有必要往下比较了,再看右边开始的第二列(8,9,10,11),我们发现这一列中的第一个数字8也大于7,便没有必要往下比较了,再看从右边开始的第三列(2,4,7,8),我们发现这一列中的第一个数字2小于7,所以2所在行的前面的数字没必要比较了,这列的第二行数字4小于7,所以这行前面的数字没必要比较了,这列第三行数字正好为7,停止比较,返回true
具体算法:
#include <iostream>
using namespace std;
bool Find(int* matrix, int rows, int columns, int number)
{
bool found = false;
int cmptimes = 0; //与整数比较的次数
if (matrix != NULL && rows > 0 && columns > 0)
{
int row = 0;
int column = columns - 1;
while (row < rows && column >= 0)
{
++cmptimes;
if (matrix[row*columns + column] == number)
{
found = true;
break;
}
else if (matrix[row*columns + column] > number)
--column;
else
++row;
}
}
printf("Compare times %dn", cmptimes);
return found;
}
//测试
void Test(int* matrix, int rows, int columns, int number, bool exception)
{
bool result = Find(matrix, rows, columns, number);
if (result == exception)
printf("Found!n");
else
printf("Faildn");
}
//输入矩阵和整数
void input()
{
int matrix[][4] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
bool exception = true;
Test((int*)matrix, 4, 4, 7, exception);
}
int main()
{
input();
system("pause");
return 0;
}
运行结果:
从该算法中可以看出,对于一个N*N的矩阵来说,寻找一个数字需要比较的次数,也就是循环的次数为N+N-1次
*1.在计算机内存中,数组的存放顺序为:先存储第一行,再第二行……按行逐渐存储在连续的内存中
*2.函数之间矩阵的传递使用指针。实参:Test((int*)matrix,...),形参:void Test(int* matrix,...)
数组当参数传递问题:数组当参数传递
最后
以上就是欢喜小虾米为你收集整理的C++数据结构_1.数组-查找算法的全部内容,希望文章能够帮你解决C++数据结构_1.数组-查找算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复