数组
关于数组的基本知识就不在此赘述了,下面是关于数组及其基本操作的代码,如有错误,还请指正。
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#pragma warning(disable:4996)
//统一规定0号位置不存放数据
void getData(int *a,int k);//向数组a(有效长度为k)中填充数据
void showData(int *a,int n);//显示有效长度为n的数组a
void bubble(int *a,int n);//对有效长度为n的数组a进行冒泡排序,时间复杂度O(n^2)
int dele(int x,int *a,int n);//从有效长度为n的数组a中删除元素x,返回有效长度,时间复杂度O(n)
int delRepeat1(int *a,int n);//删除有效长度为n的无序数组a中的重复元素,时间复杂度O(n^2)
int delRepeat2(int *a,int n);//删除有效长度为n的有序数组a中的重复元素,时间复杂度O(n)
int getMerge1(int *a,int m,int *b,int n,int *c);//异地求有序数组a,b的并集,存放在数组c中,返回有效长度(a,b内部均无重复元素),时间复杂度O(m+n)
int getMerge2(int *a,int m,int *b,int n);//本地求有序数组a,b的并集,存放在数组a中,并返回有效长度(a,b内部均无重复元素),时间复杂度O(mn+n) or O(mn)
int getInter1(int *a,int m,int *b,int n);//本地求无序数组a,b的交集,存放在数组a中,并返回有效长度(a,b内部均无重复元素),时间复杂度O(mn)
int getInter2(int *a,int m,int *b,int n,int *c,int p);//求三个有序数组a,b,c的交集,存放在数组a中,返回有效长度,时间复杂度O(m+n+p)
void getArray(int *a, int *m, int *n);//获取数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素)
int arrangeData(int *a,int n,int m);//数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素),整体无序,将数组a调整为整体有序且没有重复元素,时间复杂度O(mn+n) or O(mn)
void RefSearch(int *a,int m,int *b,int n);//索引查找,在含有m个数据的数组a中查找含有n个数据的数组b中的每个元素,数组a中的数据介于0~99
int main(void)
{
int m,n,k;
int *a,*b,*c;
a=(int *)malloc(MaxSize*sizeof(int));
b=(int *)malloc(MaxSize*sizeof(int));
c=(int *)malloc(MaxSize*sizeof(int));
getData(a,70);
getData(b,10);
getData(c,36);
showData(a,70);
showData(b,10);
showData(c,36);
free(a);
free(b);
free(c);
return 0;
}
void getData(int *a,int k)//向数组a(有效长度为k)中填充数据
{
int i;
int m=100;//设置元素最大值为m-1
for (i = 1; i <= k; i++)
{
a[i] = rand() % m;
//a[i]=i;
}
}
void showData(int *a,int n)//显示有效长度为n的数组a
{
int i;
if(n<=0)
{
printf("该数组为空.\n");
return;
}
for(i=1;i<=n;i++)
{
printf("%4d",a[i]);
if(i%15==0)
printf("\n");
}
printf("\n");
if(n%15!=0)
printf("\n");
}
void bubble(int *a,int n)//对有效长度为n的数组a进行冒泡排序
{
int i,j,lastindex=n;//上一趟排序最后交换位置
int temp;
while(lastindex>1)
{
i=lastindex;
lastindex=0;
for(j=1;j<i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
lastindex=j;
}
}
}
}
int dele(int x,int *a,int n)//从有效长度为n的数组a中删除元素x,返回有效长度
{
int i;
int k=0;//设置一堵墙,k表示墙左边的元素个数
for(i=1;i<=n;i++)
{
if(a[i]!=x)//移动到墙的左边
{
k++;
a[k]=a[i];
}
}
return k;
}
int delRepeat1(int *a,int n)//删除有效长度为n的无序数组a中的重复元素
{
int i,j;
int k=1;//设置一堵墙,墙左侧为非重复元素
for(i=2;i<=n;i++)
{
for(j=1;j<=k;j++)
{
if(a[j]==a[i])
break;
}
if(j==k+1)//表示左侧没有重复元素
{
k++;
a[k]=a[i];
}
}
return k;
}
int delRepeat2(int *a,int n)//删除有效长度为n的有序数组a中的重复元素
{
int i;
int k=1;
for(i=2;i<=n;i++)
{
if(a[i]!=a[i-1])//只需考虑其左侧相邻元素 or a[i]!=a[k]
{
k++;
a[k]=a[i];
}
}
return k;
}
int getMerge1(int *a, int m, int *b, int n, int *c)//异地求有序数组a,b的并集,存放在数组c中,返回有效长度(a,b内部均无重复元素)
{
int i,j,k;
k=0;
for (i = 1, j = 1; i <= m && j <= n;)//比较过程
{
if (a[i] < b[j])
{
k++;
c[k]=a[i];
i++;
}
else if (a[i] > b[j])
{
k++;
c[k]=b[j];
j++;
}
else//a[i]==b[j]
{
k++;
c[k]=a[i];
i++;
j++;
}
}
//比较过程结束之后
while (i <= m)
{
k++;
c[k]=a[i];
i++;
}
while (j <= n)
{
k++;
c[k]=b[j];
j++;
}
return k;
}
int getMerge2(int *a, int m, int *b, int n)//本地求有序数组a,b的并集,存放在数组a中,并返回有效长度(a,b内部均无重复元素)
{ //将b中的元素插入到数组a中
int i,j,k;
i=1;
for (j = 1; j <= n; j++)
{
//寻找插入位置
for (; i <= m && a[i]<b[j]; i++);
if (i == m + 1)
{
a[m+1]=b[j];
m++;
}
else
{
if (a[i] > b[j])//在i位置插入
{
for (k = m; k >= i; k--)//移动
a[k+1] = a[k];
a[i] = b[j];
m++;//有效长度增加
}
}
}
return m;
}
int getInter1(int *a, int m, int *b, int n)//本地求无序数组a,b的交集,存放在数组a中,并返回有效长度(a,b内部均无重复元素)
{
int i,j;
int k=0;//在a中设置一道墙,墙左侧为交集元素
for (i = 1; i <= m; i++)
{
for(j = 1;j<=n && b[j]!=a[i];j++);
if (j <= n)//表示数组b中有相同元素
{
k++;
a[k]=a[i];
}
}
return k;
}
int getInter2(int *a, int m, int *b, int n, int *c, int p)//求三个有序数组a,b,c的交集,存放在数组a中,返回有效长度
{
int i,j,k,wall;
i=1;
wall=0;
for (j = 1, k = 1; j <= n && k <= p;)
{
if(b[j]<c[k])
j++;
else if(b[j]>c[k])
k++;
else//b[j]==c[k]
{
for(;i<=m && a[i]<b[j];i++);
if (i == m + 1)//没有相同元素
return wall;
else if (a[i] == b[j])
{
wall++;
a[wall]=a[i];
i++;//i也要向后移动
j++;
k++;
}
else//a[i]>b[j],说明a中没有与b[j]相等的元素
{
j++;
k++;
}
}
}
}
void getArray(int *a, int *m, int *n)//获取数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素)
{
int i;
int *b;
b=(int *)malloc((*n+1)*sizeof(int));
for(i=1;i<=(*n);i++)
b[i]=rand()%29;
for(i=1;i<=(*m);i++)
a[i]=rand()%29;
bubble(a,(*m));
bubble(b,(*n));
(*m)=delRepeat2(a,(*m));
(*n)=delRepeat2(b,(*n));
for(i=1;i<=(*n);i++)
a[(*m)+i]=b[i];
free(b);
}
int arrangeData(int *a, int n, int m)//数组a,前m个元素有序(无重复元素),后n个元素有序(无重复元素),整体无序,将数组a调整为整体有序且没有重复元素
{
//从后向前插入
int i,j,h;
int k=m;//墙
for (j = m + 1; j <= m + n; j++)
{
a[0]=a[j];//设置哨兵
for(i=k;a[i]>a[j];i--);
// if(i>=1 && a[i]==a[j]) //什么也不干
if (i == 0 || a[i] < a[j])//插入
{
for (h = k; h >= i + 1; h--)
a[h+1] = a[h];
a[i+1] = a[0];
k++;
}
}
return k;
}
void RefSearch(int *a, int m, int *b, int n)//索引查找,在含有m个数据的数组a中查找含有n个数据的数组b中的每个元素,数组a中的数据介于0~99
{
int i;
int t[100] = {0,0};//索引数组
for(i=1;i<=m;i++)
t[a[i]]++;
for(i=1;i<=n;i++)
printf("%2d出现了%2d次\n",b[i],t[b[i]]);
}