一维数组的常用算法源代码
- 格式:docx
- 大小:18.29 KB
- 文档页数:10
c语言一维数组自定义方式
C语言中,一维数组可以通过以下三种方式自定义:
1.直接指定数组长度
●int arr[5];//定义一个长度为5的整型数组
2.通过初始化列表指定数组元素
●int arr[]={1,2,3,4,5};//定义一个长度为5的整型数组,并初始化元素值为1、2、
3、4、5
3.通过指针方式指定数组长度
●int*arr=malloc(sizeof(int)*5);//分配一个长度为5的整型数组空间
直接指定数组长度
这种方式是最简单的,只需要在数组名称后面指定数组的长度即可。
需要注意的是,数组的长度必须是常量表达式,不能是变量或函数调用结果。
通过初始化列表指定数组元素
这种方式可以同时指定数组的长度和数组元素的值。
初始化列表中的元素必须与数组元素类型一致。
通过指针方式指定数组长度
这种方式需要使用malloc()函数来分配数组空间。
malloc()函数会返回一个指向数组首元素的指针。
需要注意的是,需要使用free()函数来释放数组空间。
0881-一维数组排序(函数)时间限制:1000 毫秒内存限制:32768 K字节判题规则:严格比较void inputdate(int a[],int n); void shortdate(int a[],int n); void printdate(int a[],int n); int main(){int n,a[100];scanf("%d",&n);inputdate(a,n);shortdate(a,n);printdate(a,n);printf("\n");return 0;}void inputdate(int a[],int n) {int i;for(i=0;i<n;i++){scanf("%d",&a[i]);}}void shortdate(int a[],int n) {int i,j,x;for(i=0;i<n-1;i++){for(j=i+1;j<n;j++){if(a[i]>a[j]){x=a[i];a[i]=a[j];a[j]=x;}}}}void printdate(int a[],int n) {int i;for(i=0;i<n;i++){printf("%d ",a[i]);}}PET/CT示踪剂18F-FDG(氟代脱氧葡萄糖)氟代脱氧葡萄糖氟代脱氧葡萄糖是2-脱氧葡萄糖的氟代衍生物。
其完整的化学名称为2-氟-2-脱氧-D-葡萄糖,通常简称为18F-FDG或FDG。
FDG最常用于正电子发射断层扫描(PET)类的医学成像设备:FDG分子之中的氟选用的是属于正电子发射型放射性同位素的氟-18(fluorine-18,F-18,18F,18氟),从而成为18F-FDG(氟-[18F]脱氧葡糖)。
在向病人(患者,病患)体内注射FDG之后,PET扫描仪可以构建出反映FDG体内分布情况的图像。
2、写一个函数,实现任意两个一维整型数组的加法,减法,乘法和除法运算。
#include"stdio.h"int a[10],b[10];void main(){int i;void jia(int a[],int b[]);void jian(int a[],int b[]);void cheng(int a[],int b[]);void chu(int a[],int b[]);printf("请输入6个数组a的元素:");for(i=0;i<6;i++)scanf("%d",&a[i]);printf("请输入6个数组b的元素:");for(i=0;i<6;i++)scanf("%d",&b[i]);jia(a,b);jian(a,b);cheng(a,b);chu(a,b);}void jia(int a[],int b[]){int c[10],i;for(i=0;i<6;i++){ c[i]=a[i]+b[i];}printf("加完后的数组为:");for(i=0;i<6;i++)printf(" %d,",c[i]);printf("\n");}void jian(int a[],int b[]){int c[10],i;for(i=0;i<6;i++){ c[i]=a[i]-b[i];}printf("减完后的数组为:");for(i=0;i<6;i++)printf(" %d,",c[i]);printf("\n");}void cheng(int a[],int b[]){int c[10],i;for(i=0;i<6;i++){ c[i]=a[i]*b[i];}printf("乘完后的数组为:");for(i=0;i<6;i++)printf(" %d,",c[i]);printf("\n");}void chu(int a[],int b[]){int i;float c[10];for(i=0;i<6;i++){c[i]=(float)a[i]/(float)b[i];} printf("除完后的数组为:");for(i=0;i<6;i++)printf(" %.2f,",c[i]);printf("\n");}。
一维数组经典例题
一维数组经典例题:
一、题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
假设每种输入只会对应一个答案。
但是,你不能重复利用这个数组中同样的元素。
二、解题思路:
1. 首先遍历数组nums,确定当前遍历到的整数a;
2. 计算需要搜索的数字b=target-a;
3. 从数组元素的下一个位置开始,遍历剩余的数组元素,如果发现存在数字b,则返回a和b的下标。
三、Java代码实现:
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
int a = nums[i];
int b = target - a;
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == b) {
return new int[]{i, j};
}
}
}
return null;
}。
C语⾔⼀维数组排序交换排序 1.冒泡排序 算法思想 1.将所有元素放⼊数组中; 2.从第⼀个元素开始,依次将相邻的两个元素⽐较,若前者⼤于后者则交换; 3.重复第2步,直到没有交换为⽌。
程序实现void sort(int *a, int n){int i, j, t, ok;for(i=0; i<n-1; i++){ok=1;for(j=0; j<n-1-i; j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;ok=0;}if(ok)break;}}void sort(int a[], int n){int i, t, ok;if(n==1)reurn;else{for(i=0;i<n-1;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;ok=0;}if(ok)return;elsesort(a,n-1);}} 2.交换排序的另⼀种⽅法void sort(int temp_array[ ],int n){int i,j,t;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(temp_array[i]> temp_array[j]){t=temp_array[i];temp_array[i]=temp_array[j];temp_array[j]=t;}}选择排序 算法思想 记住每趟⽐较中最⼩的数据下标,最后将最⼩元素与起始元素交换,这样每趟只交换⼀次。
程序实现void sort(int temp_array[ ],int n){int i,j,point,t;for(i=0;i<n-1;i++){point=i;for(j=i+1;j<n;j++)if(temp_array[point]> temp_array[j]) point=j;if(point!=i){t=temp_array[point];temp_array[point]=temp_array[i];temp_array [i]=t;}}}插⼊排序 算法思想 1.新建⼀个空列表,⽤于保存有序数列; 2.从原数列取出⼀个数插⼊有序列表中,使其仍保持有序状态; 3.重复第2步,直⾄原数列为空。
一.插入:C语言数组怎么插入一个元素#include<stdio.h>#include<stdlib.h>#define MAX 40void insert(int*p,int n,int m){ int i,k;for(i=0;i<n;i++)if(p[i]>=m){ k=i;break;}for(i=n-1;i>=k;i--)p[i+1]=p[i];printf("%d\n",k);p[k]=m;}void sort(int*p,int n){int i,j;for(i=1;i<n;i++)for(j=0;i+j<n;j++)if(p[j]>p[j+1]){int t;t=p[j+1];p[j+1]=p[j];p[j]=t;}}void main(){int a[MAX];int n,i,m,d;printf("输入数据个数(n<40):");d=scanf("%d",&n);while(d!=1&&n>=40){system("cls");f flush(stdin);printf("请重新输入:");scanf("%d",&n);}printf("请输入数组元素:");for(i=0;i<n;i++)scanf("%d",a+i);printf("请输入要插入的数字:");scanf("%d",&m);sort(a,n);insert(a,n,m);for(i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}二.删除:在长度是n的数组a中,删除一个指定的元素num。
一维数组是一种常见的数据结构,它可以用来存储一组有序的数据。
在计算机编程领域,一维数组通常被用来表示一系列的数值或者其他类型的数据。
本文将介绍如何利用一维数组来计算斐波那契数列的前20项。
斐波那契数列是由意大利数学家斐波那契在13世纪提出的一个数列,它的定义如下:数列的第一项和第二项都是1,从第三项开始,每一项都是前两项的和。
即F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2),其中n>2。
计算斐波那契数列的前20项可以用多种方法,其中一种方法是利用一维数组来存储数列的每一项。
下面将介绍如何使用一维数组来计算斐波那契数列的前20项。
1. 创建一个长度为20的一维数组fibonacci,用来存储斐波那契数列的前20项。
数组的第一个和第二个元素分别赋值为1,表示数列的前两项。
2. 使用一个循环来计算数列的后18个项。
在每一次循环中,将数组的第i个元素赋值为数组的第i-1个元素和第i-2个元素的和。
具体的代码如下所示:```int fibonacci[20];fibonacci[0] = 1;fibonacci[1] = 1;for (int i = 2; i < 20; i++) {fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];}```3. 完成上述步骤后,数组fibonacci中存储的就是斐波那契数列的前20项。
可以将数组的内容打印出来,以验证计算的正确性。
以下是打印数组内容的代码:```for (int i = 0; i < 20; i++) {cout << fibonacci[i] << " ";}```通过上述方法,我们成功利用一维数组计算出了斐波那契数列的前20项。
这种方法的优点是简单易懂,代码量少,而且计算效率高。
一维数组的存储结构也符合斐波那契数列的定义,因此很适合用来存储数列的每一项。
c语言寻峰算法C语言寻峰算法引言:寻峰算法是一种常用的在一维数组中寻找局部峰值的算法,广泛应用于信号处理、数据分析等领域。
本文将介绍寻峰算法的原理、实现过程以及应用场景。
一、寻峰算法原理寻峰算法的原理很简单,即通过比较数组中的元素与其相邻元素的值,找到满足一定条件的峰值。
具体来说,寻峰算法的关键在于确定峰值的判定条件。
二、寻峰算法实现过程1. 初始化数组和变量在开始寻找峰值之前,需要先初始化待查找的一维数组和相关变量。
一般情况下,数组的长度由用户输入或者其他方式确定。
2. 遍历数组通过遍历数组的方式,比较每个元素与其相邻元素的大小关系,判断当前元素是否满足峰值的条件。
3. 判定峰值对于当前位置的元素,判断其与相邻元素的大小关系。
如果当前位置的元素大于相邻元素,则认为当前位置是一个峰值;否则,继续遍历下一个元素。
4. 输出峰值在找到峰值后,将其输出或者保存到一个新的数组中,用于后续的分析和处理。
三、寻峰算法应用场景1. 信号处理领域在信号处理中,经常需要找到信号中的极大值或极小值点。
寻峰算法可以很好地实现这一需求,比如在音频信号处理中,可以利用寻峰算法找到音频波形中的峰值,用于音频特征提取等应用。
2. 数据分析领域在数据分析中,经常需要找到数据中的极值点,以进行数据的分割和特征提取。
寻峰算法可以在一维数据中找到局部峰值,用于数据分割和特征提取。
3. 图像处理领域在图像处理中,寻峰算法可以用于图像的边缘检测。
通过在图像中寻找灰度值的局部极大或极小点,可以找到图像中的边缘信息,用于图像的分割和特征提取。
四、寻峰算法的优化和改进1. 二分查找法为了提高寻峰算法的效率,可以采用二分查找法来代替线性查找。
二分查找法可以减少比较的次数,从而提高算法的效率。
2. 动态规划法在某些特殊情况下,可以使用动态规划法来解决寻峰问题。
动态规划法可以将问题划分为子问题,通过求解子问题的最优解来得到原问题的最优解。
五、结论寻峰算法是一种常用的在一维数组中寻找局部峰值的算法,具有简单、高效的特点。
1、编写程序,从任意n个数中找出最大数和最小数,并将它们相互交换后输出。
#include <iostream>using namespace std;int main( ){int n,a[100],temp,i,maxi=0,mini=0;cin>>n;for(i=0;i<n;i++)cin>>a[i];for(i=1;i<n;i++){if(a[i]>a[maxi])maxi=i;if(a[i]<a[mini])mini=i;}temp=a[maxi];a[maxi]=a[mini];a[mini]=temp;for(i=0;i<n;i++)cout<<a[i]<<" ";return 0;}2、编写程序,将一个数组中的数循环左移。
注意:要让数组元素的值真正发生改变,而不是通过调整输出顺序实现。
#include <iostream>using namespace std;int main( ){int n,a[100],temp,i;cin>>n;for(i=0;i<n;i++)cin>>a[i];temp=a[0];for(i=1;i<n;i++)a[i-1]=a[i];a[n-1]=temp;for(i=0;i<n;i++)cout<<a[i]<<" ";cout<<sum;return 0;}3、编写程序计算Fibonacci数列前n项和,n由键盘输入。
Fibonacci数列为一整数序列,其中数列前2项值都为1,从第3项开始,每一项为前两项之和,即:1,1,2,3,5,8,13……#include <iostream>using namespace std;int main( ){int n,a[100],sum=0,i;cin>>n;a[1]=1;a[2]=1;for(i=3;i<=n;i++)a[i]=a[i-1]+a[i-2];for(i=1;i<=n;i++)sum+=a[i];cout<<sum;return 0;}4、编写程序,输入任意个学生的成绩,输入0或负数结束输入。
一维数组是指只有一个维度的数组,也就是线性排列的一组数据元素。
我们可以通过下标来访问数组中的每一个元素。
以下是一个一维数组的例子:
```C++
int arr[5] = {1, 2, 3, 4, 5};
```
这个数组名为 `arr`,它有 5 个元素,每个元素都是 int 类型。
我们可以使用下标来访问数组中的每一个元素,例如访问第三个元素:
```C++
int third = arr[2]; // third 等于 3
```
通过下标访问数组时需要注意数组越界的问题。
如果下标超出了数组的范围,就会访问到未定义的内存区域,导致程序崩溃或产生不可预测的结果。
因此,在编写程序时应该确保下标的合法性。
一维数组在程序中的应用十分广泛,例如可以用来表示一组学生的成绩、一段音频信号的采样数据等。
n个数一维数组的冒泡排序算法的实现
冒泡排序是一种简单的排序算法,它的基本思路是通过不断比较相邻两个元素的大小,将较大(或较小)的元素往后交换,重复这个过程,直到整个数组有序为止。
具体实现过程如下:
1. 从数组的第一个元素开始,依次比较相邻的两个元素的大小。
2. 如果前面的元素比后面的元素大(或小),则交换这两个元素的位置。
3. 继续通过相邻元素的比较和交换,直到把整个数组排成升序(或降序)。
以下是冒泡排序算法的具体实现,假设有n个数存储在数组a中:```
void bubbleSort(int a[], int n) {
for (int i = 0; i < n - 1; i++) { // 外层循环控制比较的轮数
for (int j = 0; j < n - i - 1; j++) { // 内层循环控制每轮比较的次数
if (a[j] > a[j + 1]) { // 如果前面的元素比后面的元素大,交换它们的位置
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
```
注意,上述代码中的两个循环分别是外层循环和内层循环,外层
循环控制比较的轮数,内层循环控制每轮比较的次数。
还有一个临时变量temp,用于交换两个元素的位置。
以上就是n个数一维数组的冒泡排序算法的实现步骤和代码,希望对你有帮助。
1.数组元素逆置
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10],t,i,j;
//随机生成数组元素,并显示
printf("逆置前:");
for(i=0;i<10;i++)
{ a[i]= rand()%100;
printf("%4d",a[i]);
}
printf("\n");
//数组元素逆置,即对称位置交换for(i=0,j=9;i<j;i++,j--)
{t=a[i]; a[i]=a[j]; a[j]=t;}
printf("逆置后:");
for(i=0;i<10;i++)
{ printf("%4d",a[i]);
}
printf("\n");
}
2.静态查找
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10],t,i,j;
//随机生成数组元素,并显示
printf("数组元素:");
for(i=0;i<10;i++)
{ a[i]= rand()%100;
printf("%4d",a[i]);
}
printf("\n");
//输入查找的数
printf("请输入要查找的数:");
scanf("%d", &t);
//静态查找:从前往后依次遍历
for(i=0;i<10;i++)
if(a[i]==t) break;//找到并退出//输出查找结果
if(i<10)
printf("%d在数组a[%d]中。
\n",t,i);
else
printf("%d不在a数组中。
\n",t); }
3.二分查找:前提数组有序
#include <stdio.h>
#include <stdlib.h>
void sort(int a[], int n)
{
int i,j, t;
for(i=0;i<n-1;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{t=a[j]; a[j]=a[j+1]; a[j+1]=t;}
}
int main()
{
int a[10],t,i,left,right,mid;
//随机生成数组元素
printf("数组元素:");
for(i=0;i<10;i++)
{ a[i]= rand()%100; }
//排序
sort(a,10);
//输出数组元素
for(i=0;i<10;i++)
{ printf("%4d",a[i]); }
printf("\n");
//输入查找的数
printf("请输入要查找的数:");
scanf("%d", &t);
//二分查找:每次与范围中间的数比较,根据结果缩小范围left=0; right=9; //起始范围
while(left<=right) //范围内有数据
{
mid=(left+right)/2; //计算中间数下标
if(t==a[mid])//找到退出
break;
else
if(t<a[mid])//范围缩小变为中间数的左侧
right=mid-1;
else
left=mid+1;//范围缩小变为中间数的右侧
}
//输出查找结果
if(left<=right)
printf("%d在数组a[%d]中。
\n",t,mid);
else
printf("%d不在a数组中。
\n",t);
}
4.删除指定位置(下标)数据
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10],t,i,j,n=10;
//随机生成数组元素并显示
printf("数组元素:\n");
for(i=0;i<n;i++)
{ a[i]= rand()%100;
printf("%4d",a[i]);
}
printf("\n");
//输入删除的下标
printf("请输入要删除数的下标:");
scanf("%d", &t);
//指定位置后一个开始,所有数据前移
for(j=t+1;j<n;j++)
a[j-1]=a[j];
n--; //数组元素有效个数减1 //输出删除后的数据
printf("删除后:\n");
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
}
//5.删除指定数据(值):找数据,删除(两步) #include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10],t,i,j,n=10;
//随机生成数组元素并显示
printf("数组元素:\n");
for(i=0;i<n;i++)
{ a[i]= rand()%100;
printf("%4d",a[i]);
}
printf("\n");
//输入删除的下标
printf("请输入要删除数的下标:"); scanf("%d", &t);
//找数据
//静态查找:从前往后依次遍历
for(i=0;i<n;i++)
if(a[i]==t) break; //找到并退出//根据查找结果
if(i<n)
{
//要删除的数的后一个数据前移
for(j=i+1;j<n;j++)
a[j-1]=a[j];
n--;
//输出删除后的数据
printf("删除后:\n");
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
}
else
printf("要删除的数%d不在a数组中。
\n",t); }
6.统计一行字母出现的次数
#include <stdio.h>
int main()
{
int n[26]={0},i;
char ch;
while((ch=getchar())!='\n')
{ if(ch>='A' && ch <='Z') ch+=32;
n[ch-'a']++;
}
for(i=0;i<26;i++)
if(n[i]>0) printf("%c字符出现次数为:%d\n",i+'a',n[i]); }
7.书后题9.31 插入一个数到有序数组中
#include <stdio.h>
int main()
{
int a[15],k,i,j,n;
//输入若干有序数
printf("请输入整数的个数(<=14):");
scanf("%d", &n);
for(i=0;i<n;i++)
scanf("%d", a+i);
printf("请输入需要插入的数:");
scanf("%d",&k);
//找位置:找第一个比k大的
for(i=0;i<n;i++) if(a[i]>k) break;
//空位置:对每个数后移,从后往前
for(j=n-1;j>=i;j--) a[j+1]=a[j];
//插入
a[i]=k;
n++;
for(i=0;i<n;i++)
printf("%d ", *(a+i)); }。