C++数据结构_1.数组-查找算法

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, %d\n", 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

\begin{pmatrix} 1& 2 & 8 &9 \\ 2& 4& 9& 12\\ 4& 7& 10& 13\\ 6& 8 & 11& 15 \end{pmatrix}

算法思想:从右边开始看第一列(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 %d\n", 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("Faild\n");
}

//输入矩阵和整数
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,...)

数组当参数传递问题:数组当参数传递

猜你喜欢

转载自blog.csdn.net/qq_33757398/article/details/81182990
今日推荐