第七周数组运算

一、数组运算

数组的集成初始化

int a[13] = {0};     //将数组所有初始化为0

集成初始化时的定位(C99ONLY)

int a[10] = 
{
    [0] = 2, [2] = 3, 6,
}

用[n]在初始化数据中给出定位

没有定位的数据接在前面 的位置后面

其他位置的值补零

也可以不给出数组的大小,让编译器算

特别适合初始数组数据稀疏的数组

数组的大小

sizeof给出整个数组所占据的内容的大小,单位是字节。

sizeof(a) / sizeof(a[0]) 是这个数组的大小

sizeof(a[0])给出数组中单个元素的大小,是、于是相除就得到了数组的单元个数

这样的代码,一旦修改数组中初始的数据,不需要修改便利的代码

数组的赋值

数组变量本身不能被赋值

要把一个数组所有元素交给另一个数组,必须采用遍历(唯一)

for(i=0; i<length; i++)
{
    b[i] = a[i];
}

 遍历数组

 通常都是使用for循环,让循环变量i从0到<数组的长度,这样循环体内最大的i正好是数组最大的有效下标

常见错误:

        循环结束条件是<=数组长度,或;

        离开循环后,继续使用i的值来做数组元素的下标!

 素数的构造

#include<stdio.h>

int main()
{
    const int maxNumber = 25;
    int isPrime[maxNumber];
    int i;
    int x;
    for(i=0; i<maxNumber; i++)
    {
        isPrime[i] = 1;
    }
    for(x=2; x<maxNumber; x++)
    {
        if(isPrime[x])
        {
            for(i=2; i*x<maxNumber; i++)
            {
                isPrime[i*x] = 0;
            }
        }
    }
    for(i=2; i<maxNumber; i++)
    {
        if(isPrime[i])
        {
            printf("%d\t",i);
        }
    }
    printf("\n");
    
    return 0;
}

二、搜索

在一个数组中找到某个数的位置(或确认是否存在)

基本方法:遍历


变量一专多能是不好的代码

根据数字显示对应字符

1美分:penny

5美分:nickel

10美分:dime

25美分:quarter

50美分:half-dollar

#include<stdio.h>

int amount[] = {1,5,10,25,50};
int *name[] = {"penny","nickel","dime","quarter","half-dollar"};

int search(int key, int a[], int len)
{
    int ret = -1;
    for(int i=0; i<len; i++)
    {
        if(key == a[i])
        {
            ret = i;
            break;
        }
    }
    return ret;
}

int main()
{
    int k = 50;
    int r = search(k, amount, sizeof(amount)/sizeof(amount[0]));
    if(r>-1)
    {
        printf("%s\n",name[r]);
    }
    return 0;
}

对cache比较友好的写法

#include<stdio.h>

int amount[] = {1,5,10,25,50};
int *name[] = {"penny","nickel","dime","quarter","half-dollar"};

struct
{
    int amount;
    int *name;
}coins[] =
{
    {1,"penny"},
    {5,"nickel"},
    {10,"dime"},
    {25,"quarter"},
    {50,"half-doullar"}
};

int search(int key, int a[], int len)
{
    int ret = -1;
    for(int i=0; i<len; i++)
    {
        if(key == a[i])
        {
            ret = i;
            break;
        }
    }
    return ret;
}

int main()
{
    int k = 50;
    //int r = search(k, amount, sizeof(amount)/sizeof(amount[0]));
    for(int i=0; i<sizeof(coins)/sizeof(coins[0]); i++)
    {
        if(k == coins[i].amount)
        {
            printf("%s\n",coins[i].name);
            break;
        }
    }

    return 0;
}

 在一些数当中搜索要找的数(二分法提高效率)

int search(int key, int a[], int len)
{
    int ret = -1;
    int left = 0;
    int right = len-1;
    while(right > left)
    {
        int mind = left+right/2;
        if(a[mind] == k)
        {
            ret = mind;
            break;
        }else if(a[mind] > k)
        {
            right = mind-1;
        }else
        {
            left = left+1;
        }
    }
    return ret;
}

三、排序初步

将无序的数组进行有序排列(选择排序)

#include<stdio.h>

int max(int a[], int len)
{
    int maxid = 0;
    for(int i=1; i<len; i++)
    {
        if(a[i] > a[maxid])
        {
            maxid = i;
        }
    }
    return maxid;
}

int main()
{
    int a[] = {2,45,6,12,87,34,90,24,23,11,65};
    int len = sizeof(a)/sizeof(a[0]);

    //选择排序
    for(int i=len-1; i>0; i--)
    {
        int maxid = max(a, i+1);
        //swap a[maxid], a[len-1]
        int t = a[maxid];
        a[maxid] = a[i];
        a[i] = t;
    }

    for(int i=0; i<len; i++)
    {
        printf("%d ",a[i]);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值