顺序表数组的遍历

一:最大最小值问题

a>在一个数据集合中(a[10]),没有重复值,有正有负。

求正数中的次大次小;

求负数中的次大次小

int max1,max2,fmax1,fmax2,i;
max1=max2=fmax1=max2=0;
for(i=0;i<10;i++){
  if(a[i]>0){
    if(a[i]>max1){
      max2=max1;
      max1=a[i]
    }
    else if(a[i]>max2)
      max2=a[i];
  }
  else if(a[i]<0){
    if(!fmax1){
      fmax1=fmax2=a[i];
    }
    else if(a[i]>fmax1){
      fmax2=fmax1;
      fmax1=a[i]
  }
  else if(fmax1==fmax2)
     fmax2=a[i];
  else if(a[i]>fmax2)
     fmax2=a[i];
  } 
}

b>在一个数据集合中(a[10]),没有重复值,有正有负

在数组中求一个连续子集,使得和值最大

int i,k,max,tempmax;//max为最大和值,k为该连续子集最后一个元素的下标
max=tempmax=0;
for(i=0;i<10;i++){
  if(tempmax+a[i]>0){
    tempmax+=a[i];
    if(tempmax>max){
      max=tempmax;
      k=i;
    }
  }
  else
    tempmax=0;
}

二:设数据集合a{2,3,5,7,8};数据集合b{3,4,6,7,8,9,10,12};均为升序;

将a与b合并成一个升序并去除重复值

int ab{N},i,j,k;\\N为常数(足够大)
i=j=0=k;
while(i<5||j<8){
  if(i<5&&j<8){
    if(a[i]<a[j])
      if(ab[k-1]!=a[i])
        ab[k++]=a[i++];
      else
        i++;
     else{

      if(ab[k-1]!=a[j])
        ab[k++]=a[j++];
      else
        j++;
  else if(i<5)
    if(ab[k-1]==a[i])
      i++;
    else
      a[k++]=a[i++];  
  else if(j<8)

    if(ab[k-1]==b[j])
      j++;
    else
      a[k++]=a[j++]; 
}
for(i=0;i<k;i++)
  printf("%d\t"ab[k]); 

三:任何一个大于1正整数可分解为若干个素数之积。要求编一个程序,输入一个正整数,输出该正整数的所有因数。

#include<stdio.h>
int main()
{
  int i,j,n;
  printf("请输入一个正整数");
  scanf("%d",&n);
  i=2;
  while(n!=1){
    while(n%i==0){
      n/=i;
      printf("%d\t",i);
    }
    i++;
  }
}

四:任意输入正整数x,y(x,y>2)

输出最小公倍数和最大公约数

#include<stdio.h>
int main()//穷举法
{
  int x,y,i,k;
  printf("请输入两个正整数:");
  scanf("%d%d",&x,&y);
  for(k=x<y?x:y;k>1&&(x%k+y%k);k--);//将k赋值为x与y中最小值,并使得k递减,当k第一次满足同时为x与y的公约数时,停止循环,此时k最大
  printf("最大公约数为%d,最小公倍数为%d",k,x*y/k);
}
数组遍历性能优于链表的原因主要与它们的存储结构和访问方式有关。 数组在内存中采用连续存储的方式,这意味着数组中的元素在内存中是按顺序排列的。当访问数组中的某个元素时,CPU可以通过计算偏移量直接定位到该元素的位置,这种访问方式称为随机访问[^3]。由于现代计算机体系结构中的缓存机制,当访问数组中的一个元素时,相邻的元素也会被加载到缓存中。因此,在遍历数组时,后续的元素可以更快地从缓存中读取,而不需要每次都访问较慢的主内存,这大大提高了遍历效率。 相比之下,链表中的元素在内存中是分散存储的,每个元素(节点)包含数据部分以及指向下一个节点的指针。为了访问链表中的特定元素,必须从头节点开始逐个遍历每个节点,直到找到目标节点。这种方式使得链表的访问时间复杂度为O(n),即平均需要n/2次操作来访问一个特定位置的元素。此外,因为链表节点之间的链接关系,即使是在遍历过程中,也无法利用缓存的优势,因为下一个节点的实际地址只有在当前节点被处理后才能确定,这就导致了链表遍历时不能有效地预取数据到缓存中。 对于小规模的数据集(例如1万条以下),数组和链表在遍历效率上的差异可能不太明显,但对于大规模数据集来说,数组遍历效率显著高于链表。特别是当数据量增大时,数组遍历的优势更加明显,这是因为数组能够更好地利用硬件级别的缓存优化[^1]。 综上所述,数组遍历性能优于链表的主要原因在于其连续的内存布局允许高效的随机访问,并且能有效利用CPU缓存机制,从而减少访问内存的次数,提高执行速度。 ```python # 示例代码:遍历数组与链表的时间对比示意 import time # 创建一个大数组 array = list(range(1000000)) # 测试数组遍历时间 start_time = time.time() for i in array: pass end_time = time.time() print(f"Array traversal took {end_time - start_time} seconds") # 创建一个链表类 class Node: def __init__(self, value): self.value = value self.next = None # 构建一个大的链表 head = Node(0) current = head for i in range(1, 1000000): current.next = Node(i) current = current.next # 测试链表遍历时间 start_time = time.time() current = head while current is not None: current = current.next end_time = time.time() print(f"Linked list traversal took {end_time - start_time} seconds") ``` 请注意,上述Python示例仅用于说明目的,实际运行结果会受到多种因素的影响,包括编程语言、实现细节、系统环境等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值