小弟这里有个程序代码:关于排序并确定各数值原始位置,请各位指导下,先谢谢啦!
/*说明:我这里有一个5*5的数组(实际数组为1024*1024,这里只是为了验证算法的可行性),现在想从中找出9个最大的数值并存入3*3的数组中,并且要记录这9个数值在原来5*5数组中的位置,行列值存入r[],c[],同时保持这些行列值在原始5*5数组中前后相对位置不变(不知道说清楚了么),小弟编了一个程序,但是运行起来一直有问题,的确没辙了,想请教下大家!还请指教下!
算法思路如下:先由小到大排序,同时记录它们在5*5数组中最原始的位置r[],c[];然后结合这些位置和原始5*5数组,找到最大的9个数值按前后相对位置不变的原则存入bb[][]中。
如果大家有其他的思路,也请指导下!多谢啦!
*/
// paixu_0.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main(int argc, char* argv[])
{
int aa[5][5]={ {4,12,54,45,23},
{6,34,32,54,64},
{67,34,54,32,43},
{12,43,56,43,1},
{5,56,78,98,15}
};
int i,j,temp,*p,ia,ib,ja,jb,k,m,n,*q;
int a[5][5],r[25],c[25],bb[3][3];
int rc,ra,ca,counts;
//****************************************************//
//------数组的复制-----//
for(ia=0;ia<5;ia++)
{ for(ib=0;ib<5;ib++)
{a[ia][ib]=aa[ia][ib];
printf("%3d",a[ia][ib]);
}
printf("\n");
}
printf("\n");
//**********************************************************//
//------------数组的排序--------------//
p = &a[0][0];
q=&aa[0][0];
counts=0;ra=0;ca=0;rc=0;
for(i=0;i<25-1;i++)
{
for(j=0;j<25-i-1;j++)
{
ra=counts/5;
ca=counts%5;
counts++;
if(*(p+j) > *(p+j+1))
{
temp = *(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
// printf("%3d",a[i][j]);
if(j>0)
{ *q=*(p+j-1);
if(*(q)!=*(p+j+1))
{
r[rc]=ra;
c[rc]=ca;
}
}
else {
r[rc]=ra;
c[rc]=ca;
}
}
}
// printf("\n");
rc++;
}
//此处是整个程序中最为关键的地方:一方面进行二维数据的排序,从小到大;
//另一方面对每一个排序的数据记录它在5*5二维数组中最原始的位置,并将行列分别存入数组r[]和c[]中!
//*****************************************************************************************************//
//-------输出排序后的数据----------//
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
//--------提取其中3*3的peak并存入bb[]中----------//
for(ja=0;ja<5;ja++)
for(jb=0;jb<5;jb++)
{
for(k=0;k<9;k++)
{
if(ja==r[k]&&jb==c[k])
{
for(m=0;m<3;m++)
for(n=0;n<3;n++)
bb[m][n]=aa[ja][jb];
}
}
}
//结合排序得到的最大的3*3个数据的位置求出相应的3*3矩阵,并存入bb[][]中!
//这是本程序的最终目的:即从5*5矩阵中找出3*3的最大的9个数据,同时记录他们的位置,并存入bb[][]
//(要求这9个数据在aa中的前后位置关系不能更改,即:如果78在aa中前面是56,后面是98,
//那么bb中数据的存储顺序仍然是这样的(56,78,98),不能为(67、78、98)等)
//***********************************************************************************************//
//--------输出3*3peak数据-------//
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%3d ",bb[i][j]);
}
printf("\n");
}
return 0;
}