数组(基本题型总结)

对于数组来说,很多人认为很简单,容易理解,但是,数组常见的类型,你是否已经学会了呢?

本来是想总结数组的,但是思来想去也不知道总结什么,都是概念,理解就好了,所以今天给大家总结一下数组相关类型的题型。

第一个题型,排序数组

首先,来看下第一个方法,我们看下这个代码,这里用到了一个库函数,非常的好用

 

先不多说,看看我运行出来的结果

 大家可以看到,这里我用了一个库函数,qsort函数,这个函数把数组变为有序数组的底层原理是用快速排序法来排序的,那么,这个函数应该怎么使用呢?

void qsort( void *base, 
            size_t num,
            size_t width,
            int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

这是qsort函数的一个模板,里面有四个参数,我一一讲解,第一个参数,也就是 void*base,这个意思就是你要排序的数组的首元素的地址,第二个,size_t num的意思就是数组总共有几个元素,size_t width的意思就是每个元素所占字节是多少,最最最后一个,昨天说过的,函数指针类型的参数。他这个指针所指向的那个函数,有两个参数,都是const void*类型,这个函数的返回值是int类型。而他指向这个函数的功能是比较数组中相邻两个数据的大小,假设就那第一个元素和第二个元素来说,如果第一个元素比第二个元素大,那就返回大于0的数,相等就返回0,小得话就返回小于0得数。具体他是怎么实现比较的我们不用管他,我们只是用它就行。如果有小伙伴想深入了解这个函数的可以看源代码https://gitee.com/stickykkkkkk/exercise/commit/1a589ce6c913b8c8932bd4e3c7324b2897fbbaec

这个是第一个方法,第二个方法就是冒泡排序了,代码如下:

int main()
{
	int arr[10] = { 54,12,98,100,32,16,59,4,3,6 };
	int i = 0;
	int j = 0;
	int t = 0;
	for (i = 0; i < 9; i++)
	{
		for (j = 0; j < 9 - i; j++)
		{
			if (arr[j] > arr[j+1])
			{
				t = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = t;
			}
		}
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

来看看运行之后的结果

冒泡排序的核心思想就是两两对比,每一趟找出个最大的值,放到数组最后,如果又不懂得可以私信问我。

第二种题型就是输入一个值,在数组(无序数组)中找到这个值了,方法:遍历

//方法:遍历
//int main()
//{
//	int arr[10] = { 54,12,98,100,32,16,59,4,3,6 };
//	int n = 0;
//	scanf("%d", &n);
//	int i = 0;
//	int flag = 0;
//	for (i = 0; i < 10; i++)
//	{
//		if (n == arr[i])
//		{
//			printf("%d", i);
//			flag = 1;
//			break;
//		}
//		else;
//	}
//	if (0 == flag)
//	{
//		printf("%d", -1);
//	}
//	return 0;
//}

 这个方法就没什么好说的,就是遍历数组即可。

如果数组是有序数组,那么出了遍历以外,还可以使用二分查找

//第二种:二分查找
//int main()
//{
//	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//	int n = 0;
//	int left = 0;
//	int right = sizeof(arr) / sizeof(arr[0]) - 1;
//	int mid = (right - left) / 2 + left;
//	int flag = 0;
//	scanf("%d", &n);
//	while (left <= right)
//	{
//		mid = (right - left) / 2 + left;
//		if (n == arr[mid])
//		{
//			flag = 1;
//			printf("%d", mid);
//			break;
//		}
//		else if (n < arr[mid])
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			left = mid + 1;
//		}
//	}
//	if (0 == flag)
//	{
//		printf("%d", -1);
//	}
//	return 0;
//}

二分查找相比很多小伙伴应该是很熟悉了,就不多说了

下面的题型是找数组中的最大值(最小值同理)

//找数组中的最大值问题(最小值同理)
//方法一:暴力求解
//一般不建议用这个方法求解,因为其时间复杂度较大,如果数组是1000呢?算法时间就会慢了。
//int main()
//{
//	int arr[10] = { 54,12,98,100,32,16,59,4,3,6 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 10; i++)
//	{
//		for (j = 1; j < 10; j++)
//		{
//			if (arr[i] >= arr[j]);
//			else
//			{
//				arr[i] = arr[j];
//			}
//		}
//		printf("%d", arr[i]);
//		break;
//	}
//	return 0;
//}
//方法二:
//这个方法不仅是从时间复杂度还是空间复杂度来看,都比第一种方法要好,且代码行数较少
//int main()
//{
//	int arr[10] = { 54,12,98,100,32,16,59,4,3,6 };
//	int max = 0;
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		if (max >= arr[i]);
//		else
//		{
//			max = arr[i];
//		}
//	}
//	printf("%d", max);
//	return 0;
//}

第一种就是所谓的暴力求解了,很简单。也就是遍历数组,第二种说实话我也不太清楚应该是什么方法,但是个人感觉第二种比第一种方法要简单,且容易理解。

总结,数组不只这些题型,还有插入删除等等,这些其实也比较简单,只要初始化数组的空间足够大,就可以插入数据,删除数据也很简单,直接覆盖即可。这些思想和数据结构的顺序表类似。

最后,希望大家能点一下赞,多多支持一下,谢谢,如果有更好的方法,或是不同的方法,希望大家评论区留言,我们共同探讨,互相学习,共同进步。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值