二维数组

int a[N][M]={{1,2,3},{4,5}};
a[0][0]=1,a[0][1]=2,a[0][2]=3
a[1][0]=4,a[1][1]=5;
一般矩阵习惯从1,1开始到 n,m结束 ,n表示行 ,m表示列

 
矩阵的边缘判断 i==1||i==n||j==1||j==m 


点(i,j)对应的上(x-1,j),下(x+1,j),左(x,j-1),右(x,j+1);
点(i,j)到上(i),下(n-i+1),左(j),右(m-j+1) 

和(i,j)同左上到右下的对角线 (i-j==x-y) 
和(i,j)同左下到右上的对角线 (i+j==x+y) 

输入一个n行m列,以(1,1)开始的变量名为a的二维数组
for(int i=1;i<=n;i++)
{
	for(int j=1;j<=m;j++)
	{
		cin>>a[i][j];
	}
} 

输出一个n行m列,以(1,1)开始的变量名为a的二维数组
for(int i=1;i<=n;i++)
{
	for(int j=1;j<=m;j++)
	{
		cout<<a[i][j]<<" ";
	}
	cout<<endl;//每输出完一行,输出换行 
} 

矩阵加法 c[i][j]=a[i][j]+b[i][j];

矩阵乘法
for(int k=1;k<=t;k++) //t是第一个矩阵的列数,也是第二个矩阵的行数 
{
	c[i][j]+=a[i][k]*b[k][j];
}

排序

插入排序(找到第一个小于等于它的元素插入到后面)
for(int i=2;i<=n;i++) 
{
	int j=i-1; //比较元素的位置 
	int t=a[i]; //当前元素 
	while(j>=1&&a[j]>t) //继续往前移动 
	{
		a[j+1]=a[j];
		j--;	
	}	
	a[j+1]=t; //找到了合适的位置 
} 

选择排序(每次选择一个最小的元素放在当前位置)
for(int i=1;i<=n;i++)
{
	int t=i;
	for(int j=i+1;j<=n;j++) //枚举i以后的所有位置 
	{
		if(a[j]<a[t])
		{
			t=j;
		}
	}	
	swap(a[t],a[i]);
} 

计数排序(依次统计每个数出现的次数,然后依次放到新数组之中)
for(int i=1;i<=n;i++)
{
	int x;
	cin>>x;
	cnt[x]++;//统计x出现的次数 
} 
int i=1;
for(int j=0;j<M;j++) //枚举整个范围 
{
	while(cnt[j]>0) //出现过就放到a数组之中 
	{
		a[i++]=j; //依次存放 
		cnt[j]--; //j个数少1 
	}
} 

//快速排序

 
sort(a,a+n) //a[0]到a[n-1]从小到大排序
reverse(a,a+n) //a[0]到a[n-1] 翻转

sort(a,a+n,greater<int>()) //a[0]到a[n-1]从大到小排序

sort(a+1,a+n+1) //a[1]到a[n]从小到大排序

struct Stu{
	string name;
	int sc;
}; 
//定义了一个包含名字和分数的Stu类型的数据类型

Stu a;//声明了一个Stu类型的变量a
Stu b[100];  //声明了一个Stu类型的数组b


bool cmp(Stu a,Stu b) 
{
	if(a.sc>b.sc) return 1;//按照成绩从大到小排序
	if(a.sc==b.sc&&a.name<b.name); //成绩相同,按照名字的字典序排序
	return 0;   //不符合规则 
}
sort(b+1,b+1,cmp);//b[1]到b[n]按照cmp定义的规则排序


struct Stu{
	string name;
	int sc;
	bool operator<(const Stu& w)const
	{
		if(sc>w.sc) return 1;
		if(sc==w.sc&&name<w.name) return 1;
		return 0;
	}
}; 
//定义了一个包含名字和分数的Stu类型的数据类型,且确定了排序规则 
//可以直接使用(b+1,b+n+1) 进行排序

0 comments

No comments so far...