2021王道数据结构 习题2.2.3 代码题 比答案简洁的解法

//8
void exchange(int *a,int m,int n)
{
	int b[m+n];
	int i,j;
	for(i=m,j=0; i<m+n; i++,j++)	//后n个数存到b
		b[j]=a[i];
	for(i=0; i<m; i++,j++)	//前m个数存到b
		b[j]=a[i];
	for(i=0; i<m+n; i++)    //复制
		a[i]=b[i];
}
//10
void left_move(int *a,int n,int p)//时间o(n) 空间o(1)
{
	int b[p];
	int i,j;
	for(i=0; i<p; i++)
		b[i]=a[i];
	for(j=0; i<n; j++,i++)	//到这步 i==p
		a[j]=a[i];
	for(i=0; i<p; i++,j++)  //到这步 j==n-p
		a[j]=b[i];
}
//11
void find_midnum(int *a,int *b,int n)//时间空间o(n)
{
	int i,j,k,c[n];
	
	for(i=j=k=0; k<n; k++)//按顺序合并一半即可 合并完后最后一个元素即为中位数
	{
		if(a[i]<b[j] )
			c[k]=a[i++];
		else if(a[i]>=b[j])
			c[k]=b[j++];
	}
	printf("%d",c[n-1]);
}
//12
bool find_main_num(int *a,int n)//时间空间o(n)
{
	int b[n]={0},i;
	for( i=0; i<n; i++)
		b[a[i]]++;	//直接统计每个数的频次
	int max=-1;		//初值-1 有主元素就会被覆盖 否则输出的就是-1
	for( i=0; i<n; i++)
		if(b[i]>max && b[i]>n/2)
			max=i;
	printf("%d",max);
}
发布了35 篇原创文章 · 获赞 2 · 访问量 900

猜你喜欢

转载自blog.csdn.net/qq_45735810/article/details/104110163