数组算法:倒置,查找,插入,删除

简介: 数组算法:倒置,查找,插入,删除

数组的倒置

方法一:定义原数组,再定义一个用来存储倒置后的数据的数组,即是将数据一一拷贝到一个新的数组。

代码实现

#include <stdio.h>
int main (void)
{
  int a[5],b[5],i;
  printf("请输入5个数:\n");
  for (i=0;i<5;i++)
    scanf("%d",&a[i]);
  for (i=0;i<5;i++)
    b[i]=a[4-i];
  for (i=0;i<5;i++)
    printf("%d\t",b[i]);
  printf("\n");
  return 0;
}

但是这样将数据一一拷贝,算法实现的效率并不高。

方法二:将第一个元素和最后一个元素进行交换,第二个元素和倒数第二个元素进行交换……依次……

这时,可能要考虑到数组元素的奇偶问题。若元素个数为偶数,那么都可以实现一一交换。若元素个数为奇数,则会留下最中间的一个元素。

定义两个变量i和j,i=0,j=n-1,每交换一次,i++,j–。只要i<j,就使循环一直进行。

代码实现

#include <stdio.h>
int main (void)
{
  int a[10],i,j,temp;
  printf("请输入10个数:\n");
  for (i=0;i<10;i++)
    scanf("%d",&a[i]);
  i=0;j=9; //注意这里必须再次给i赋值。因为经过上面的for循环后,i的值变为为9
  while (i<j)
  {
    temp=a[i];
    a[i]=a[j];
    a[j]=temp;
    i++;j--;
  }
  for (i=0;i<10;i++)
    printf("%d\t",a[i]);
  return 0;
}

数组元素的查找

方法一:顺序查找

输入一个数组,再输入一个数字,按照顺序依次查找。

#include <stdio.h>
int main (void)
{
  int a[10]={64,72,87,98,78,95,75,84,91,90};
  int i,m,flag=0;
  printf("请输入一个数字:\n");
  scanf("%d",&m);
  for (i=0;i<10;i++)
    if (a[i]==m)
    {
      flag=1;
      break;
    }
  if (flag==1)
    printf("YES\n");
  if (flag==0)
    printf("NO\n");
  return 0;
}

数组插入

在坐标为index位置插入一个数字。可以再定义一个用来存放插入了一个元素后的新数组。

代码实现

#include <stdio.h>
int main (void)
{
  int a[11]={2,3,4,7,8,10,23,56,7,12,3};
  int b[12],index,i,m;
  printf("请输入插入值的下标:\n");
  scanf("%d",&index);
  printf("请输入插入值:\n");
  scanf("%d",&m);
  for (i=0;i<12;i++)
  {
    if (i<index)
      b[i]=a[i];
    else if (i==index)
      b[i]=m;
    else
      b[i]=a[i-1];
  }
  for (i=0;i<12;i++)
    printf("%d\t",b[i]);
  return 0;
}

将某数插入到已经排好的序列中。

可以先比较,看插入的数在哪两个数之间,推断之后插入的数应该在的位置。

代码实现

#include <stdio.h>
int main (void)
{
  int a[6]={3,8,19,36,78,87};
  int b[7],i,m,index;
  printf("请输入要插入的值:\n");
  scanf("%d",&m);
  for (i=0;i<6;i++)
    if (m>a[i] && m<=a[i+1])  //假定比最大值还大,或者比最小值还小,代码有些问题。
      index=i+1;
  for (i=0;i<7;i++)
  {
    if (i<index)
      b[i]=a[i];
    else if (i==index)
      b[i]=m;
    else
      b[i]=a[i-1];
  }
  for (i=0;i<7;i++)
    printf("%d\t",b[i]);
  printf("\n");
  return 0;
}

删除算法

在下标为index的位置删除一个数字。

代码实现

#include <stdio.h>
int main (void)
{
  int a[10]={23,45,76,93,45,76,81,23,41,56};
  int index,b[9],i;//数组b用来存储删除元素后的数据
  printf("请输入你想删除的元素的下标:\n");
  scanf("%d",&index);
  for (i=0;i<9;i++)
  {
    if (i<index)
      b[i]=a[i];
    else if (i>=index)
      b[i]=a[i+1];
  }
  for (i=0;i<9;i++)
    printf("%d\t",b[i]);
  return 0;
}


相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
46 0
|
4月前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
4月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
48 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
27 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
4月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
4月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
4月前
|
算法
【算法】模拟算法——外观数组(medium)
【算法】模拟算法——外观数组(medium)
|
4月前
|
算法
【算法】前缀和——除自身以外数组的乘积
【算法】前缀和——除自身以外数组的乘积
|
4月前
|
算法
【算法】前缀和——寻找数组的中心下标
【算法】前缀和——寻找数组的中心下标