方阵转换2

97 阅读1分钟

` //记录最大值以及最小值 #include "stdio.h" #include <stdlib.h> #include <time.h> #define M 5

void InputData(int table[M][M]) {

int i,j;

for(i=0; i<M; i++) 
	for(j=0; j<M; j++)
		table[i][j] = rand()%100;

		//scanf("%d", &(table[i][j]));

}

//打印数组 void OutputData(int table[M][M]) { int i,j;

for(i=0; i<M; i++)
{
	for(j=0; j<M; j++)
	{
		printf("%-2d  ", table[i][j]);
	}
	printf("\n");
}

}

//交换,参数依次为待交换元素的数组,交换的数值,交换的位置(0,4,20,24之间),记录已经交换位置的数组

void swap(int (table)[M],int value,int pos,int mytable[MM]) { int tmp,i,j;

for (i = 0;i < M && (0 == mytable[pos]);i++)
	for (j = 0;j < M;j++)
 		if(table[i][j] == value && mytable[i*5+j] == 0 )
			//不要对已经交换过的位置重复计算,如最小值、次小值都是4,那么确定次小值交换位置时要刨除最小值位置
		{
			tmp = table[pos/M][pos%M];
			table[pos/M][pos%M] = value;
			table[i][j] = tmp;
			
			mytable[pos] = 1;//标记该位置已经交换过
			
            		break;
		}

}

void order(int table[M][M]) {

int mytable[M*M],i,j,tmp,temp[5];
//将原表复制到一个一维数组中
for(i = 0;i < M;i++)
	for(j = 0;j < M;j++)
		mytable[i*M + j] = table[i][j];
//采用冒泡法找到最大值 
for(i = 0;i < M*M-1;i++)
{
	if(mytable[i] > mytable[i + 1])
	{
		tmp = mytable[i];
		mytable[i] = mytable[i + 1];
		mytable[i + 1] = tmp;
	}
}

//采用冒泡法找到4个最小值
for(i = 0;i < 4;i++)
	for(j = i + 1;j< M*M;j++)
		if(mytable[i] > mytable[j])
		{
			tmp = mytable[i];
			mytable[i] = mytable[j];
			mytable[j] = tmp;
		}

temp[0] = mytable[0];
temp[1] = mytable[1];
temp[2] = mytable[2];
temp[3] = mytable[3];
temp[4] = mytable[M*M-1];

for(i = 0;i < M*M;i++)
{
	mytable[i] = 0;
}

//进行5轮位置交换
swap(table,temp[0],0,mytable);

swap(table,temp[1],M-1,mytable);

swap(table,temp[2],M*M-M,mytable);

swap(table,temp[3],M*M-1,mytable);

swap(table,temp[4],(M*M-1)/2,mytable);

}

int main(int argc, char* argv[]) {

int table[M][M] = {	{35,34,33,32,31},
				{30,29,28,27,26},
				{25,24,23,22,21},
				{20,19,18,17,16},
				{15,14,13,12,11}};
int i,j;

long hStart, lStart, hEnd, lEnd;
//分别代表开始的高位和低位以及结束的高位和低位,由于NS精度实在太高,所以数值会很大,1个32位的变量无法存储,需要两个32位变量
long hCnt, lCnt;//差值的高位和低位
unsigned long timer = 0;

printf("The matrix you input is:\n");
InputData(table);
OutputData(table);

__asm //内嵌汇编的语法可能不同编译器有些不同
{
RDTSC
mov hStart, edx
mov lStart, eax
}

order(table);//交换


__asm
{
RDTSC
mov hEnd, edx
mov lEnd, eax
//获取两次计数器值得差
sub eax, lStart
cmp eax, 0
jg L1
neg eax
jmp L2

L1: mov lCnt, eax
L2: sub edx, hStart
mov hCnt, edx
}	
timer = (hCnt<<32) + lCnt; //得出最终结果,timer就是所得的差值(单位ns)5800NS
printf("It takes %ld ns\n",timer);

//输出交换后的table表
printf("You result is:\n");
for (i = 0;i < M;i++)
	for(j = 0;j<M; j++){
		printf("%-2d  ",table[i][j]);
		if((i*M+j+1)%M == 0)
		printf("\n");
	}

return 0;

}