对于数组来说,很多人认为很简单,容易理解,但是,数组常见的类型,你是否已经学会了呢?
本来是想总结数组的,但是思来想去也不知道总结什么,都是概念,理解就好了,所以今天给大家总结一下数组相关类型的题型。
第一个题型,排序数组
首先,来看下第一个方法,我们看下这个代码,这里用到了一个库函数,非常的好用
先不多说,看看我运行出来的结果
大家可以看到,这里我用了一个库函数,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;
//}
第一种就是所谓的暴力求解了,很简单。也就是遍历数组,第二种说实话我也不太清楚应该是什么方法,但是个人感觉第二种比第一种方法要简单,且容易理解。
总结,数组不只这些题型,还有插入删除等等,这些其实也比较简单,只要初始化数组的空间足够大,就可以插入数据,删除数据也很简单,直接覆盖即可。这些思想和数据结构的顺序表类似。
最后,希望大家能点一下赞,多多支持一下,谢谢,如果有更好的方法,或是不同的方法,希望大家评论区留言,我们共同探讨,互相学习,共同进步。