数组常见题型及解题方式汇总(1)
一.查找
1.线性查找
不要求数据表是已经排好序的。
- 从线性数据表中的第一个(或者最后一个)记录开始查找。
- 以此将记录的关键字与查找的关键字进行比较。
当某个记录的关键字与查找关键字相等的时候,即查找成功。
反之,查完所有记录都没有与之相等的关键字,则查找失败。
(顺序)
int linsearch(int num[],int x,int n)
{
int i;
for( int i=0;i<n;i++)
{
if(num[i]==x)
return i;
}
return -1;
}
(逆序)
for(int i=n-1;i>=0;i--)
2.二分查找(折半查找)
前提是要已经排好序,速度会更快。
- 先将表的中间位置记录的关键字与查找关键字比较。
- 如果两者相等,则查找成功。
- 如果不等,则将表分为两个部分,根据比较结果,决定查找哪个子表。
mid=(low+high)/2;
缺点:
- 必须采用顺序存储结构。
- 适用于不经常变动而查找频繁的有序表。
3.查找最大(最小)值
1.第一个数作为最大(小)值。要放入局变量中保存,如:max(min)。
2.从第二个数开始一直到最后一个数
与当前最大(最小)值进行比较,保存大(小)的数据放在max(min)中。
int findmax(int score[],int n)
{
int maxnum,i;
for(i=1;i<n;i++)
{
if(score[i]>score[maxnum])
{
maxnum=i;
}
}
return maxnum;
}
二.插入(字符串常用)
插入到下标处,在有序表中插入,保持有序性。
元素的移动
void insert(char*s,char ch)
{
int j,n;
n=strlen(s);
for(j=n;j>=0;j--)
{
s[j+1]=s[j];
}
s[0]=ch;
}
有序数组插数
for(j=n-1;j>=0&&a[i]>x;j--)
{
a[i+1]=a[i];
}
a[i+1]=x;