目录
2.对数组a[10]={10,4,3,7,9,18,14,12,17,15}进行排序
一、集合、列表和数组的概念
1.集合
(1)集合概念
集合一般是:将一个或多个确定的元素所构成的集体。
例a:商店中的所有水果
例b:王者荣耀中的多有英雄
(2)集合的三要素
花括号、逗号和元素
例a:{1,2,3,4,5}
例b:{苹果,香蕉,西瓜}
(3)集合的特性
a:无序性:集合中的元素顺序无规律,无序。
b:确定性:集合中的元素是确定的
c:互异性:集合中的元素必须互不相同
2.列表
(1)列表概念
列表:列表是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。
(2)列表特征
a:有序
b:长度可变
(3)主要表现
数组和链表,栈和队列是两种特殊类型的链表。
注:列表中添加、删除元素的具体实现方式不同的编程语言有所区分。
3.索引
(1)索引概念
索引是针对表而建立的,加速对表中数据行的检索而创建的一种分散的存储结构。
(2)优缺点
优点:
a:快速取数据的检索速度
b:创建了唯一性,保证每一行的数据记录的唯一性;
c:加速了表与表的连接,减少了查询中分组和排序的时间
缺点:
a:索引需要占物理空间。
b:当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
4.数组
(1)数组概念
数组会用一些名为 索引
的数字来标识每项数据在数组中的位置,且在大多数编程语言中,索引是从 0
算起的。
(2)数组与列表的区别
列表中没有索引,数组中有索引,这是数组与列表最大的不同点。同时数组中的元素在内存中是连续存储的,且每个元素占用相同大小的内存;列表中的元素在内存中可能彼此相邻,也可能不相邻。
二、一维数组
1.一维数组概念
相同类型的集合,称为数组。
2.定义方式
数据类型 数组名 [常量表达式]
int a[10] //整型数组,数组名为a,10为常量表达式,[]数组长度
3.数组初始化
/*
int a[3];
a[0]=1;
a[1]=2;
a[3]=4;
//由于此方法较为复杂,一般采用其省略写法
*/
int a[0]={1,2,4}; //省略写法
float b[10]={3,2,4,5,1}; //未赋值的都为0
char s[]="study" //字符型数组s[],长度为6,字符以"\0"结尾,故长度为6;
4.一维数组的下标
一维数组的下标实际是数组第一个元素的偏移量。
一维数组最后一位元素的下标为(长度-1)
例1:
#include <stdio.h>
int main()
{
int a[10]={1,4,3,7,9,18,14,12,17,15};
for(int i=0;i<10;++i)
{
printf("%d ",a[i]);
}
printf("\n");
}
结果演示:
5.一维数组的运用
1.求数组中的最大最小值
#include <stdio.h>
int main()
{
int a[10]={10,4,3,7,9,18,14,12,17,15};
int max=a[0],min=a[0];
for(int i=0;i<10;++i)
{
if(a[i]>=max)
{
max=max;
}
if(a[i]<min)
{
min=a[i];
}
}
printf("最大值为:%d,最小值为:%d",max,min);
printf("\n");
}
结果演示:
2.对数组a[10]={10,4,3,7,9,18,14,12,17,15}进行排序
#include <stdio.h>
int main()
{
int a[10]={10,4,3,7,9,18,14,12,17,15};
int tmp=0;
for(int i=0;i<10;++i)
{
for(int j=i+1;j<10;++j)
{
if(a[i]>=a[j])
{
tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}
}
for(int k=0;k<10;++k)
{
printf("%d ",a[k]);
}
printf("\n");
}
结果演示:
三、二维数组
1.二维数组概念
存储数组的数组,称为二维数组
例2:a[3][4]
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
2.二维数组的定义
数据类型 数组名 [常量表达式][常量表达式]
3.二维数组初始化
//分段赋值
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
//连续赋值
int b[3][3]={1,2,3,4,5,6,7,8,9};
例3:
#include <stdio.h>
int main()
{
int a[3][3]={80,89,85,90,98,88,87,86,99};
for(int i=0;i<3;++i)
{
for(int j=0;j<3;++j)
{
printf("%d ",a[i][j]);
}
}
printf("\n");
}
结果演示:
四、例题
1.寻找数组的中心索引
给你一个整数数组 nums ,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1
(作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/yf47s/
来源:力扣(LeetCode))
代码详解:
int pivotIndex(int* nums, int numsSize){
int sum=0,a=0;
for(int i=0;i<numsSize;++i){
sum+=nums[i]; //求和
}
for(int i=0;i<numsSize;++i){
if(2*a+nums[i]==sum){
return i;
}else a+=nums[i];
}
return -1;
}
2.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/cxqdh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/cxqdh/
来源:力扣(LeetCode)
//由于nums[]数组第有序的,可以采用二分查找的方法
int searchInsert(int* nums, int numsSize, int target){
int left=0,right=numsSize-1; //定义左右边界
int mid;
while(left<=right){
mid=left+(right-left)/2; //求中间值下标
if(nums[mid]==target){ //判断中间值与目标值是否相等
return mid;
}
if(nums[mid]>target){ //中间值大于目标值时
right=mid-1; //缩小判断区间,
}else {
left=mid+1;
}
}
return left;
}
五、总结
数组在 C 语言中非常重要的,在程序设计中是常用的数据结构,属于构造类型。在设计中要灵活运用数组。