1. 程式人生 > >資料結構之(三)之陣列篇

資料結構之(三)之陣列篇

①設計一個演算法,將一維陣列A(下標從1開始)中的元素迴圈右移k位,要求 只用一個元素大小的附加儲存空間。給出演算法的時間複雜度。

#include<stdio.h>
 
 int Cir(int a[],int n,int k)//陣列a,陣列的 個數,迴圈的位數 
 {
 	for(int i=0;i<k;i++)
 	{    int t;
 	     t=a[n-1];
 		for(int j=n-1;j>0;j--)//依次右移
 		{
 			a[j]=a[j-1];
		}
 		a[0]=t;
	 }
 	
 }
 int main()
 {
 	
 	int a[]={0,53,43,25,32,24,54,87,234};
 	Cir(a,9,5);
 	for(int i=0;i<9;i++)
 	{
 		printf("%5d",a[i]);
	 }
 	return 1;
 }

此演算法用了一個int型別的儲存空間空間複雜度為O(1),時間複雜度為O(n的平方)。

②若二維矩陣中的某個元素aij是第i行中的最小值,同是又是第j列中的最大值,則稱此元素為該矩陣的一個馬鞍點,試編寫演算法求出矩陣中的所有馬鞍點

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)
int maan(int a[][10],int n)
{  int i,j,k;
	for(i=0;i<n;i++ )
	{     
	    int min=a[i][0];
	    int t;
		for( j=1;j<n;j++)
		{	
			if(a[i][j]<min)
			{
			  min=a[i][j];
		    }	
		}
		 for( k=i+1;k<n;)
			  {
			  	if(min>a[k][j]) 
			     k++;
			  }
			if(k==10)
			{
				printf("%2d%2d%2d\n",i,j,min);	  
			}   
	}
	
}
int main()
{   int a[10][10];
    memset(a,0,sizeof(a));
	srand((int)time(0));
	for(int x=0;x<10;x++)
	for(int j=0;j<10;j++)
	{
		a[x][j]=random(100);
	}
	for(int x=0;x<10;x++)
	{
	
	for(int j=0;j<10;j++)
	{
		printf("%3d",a[x][j]);
		
	}
	printf("\n");
}
	 maan(a,10);
}

用到了<time.h>以時間隨機產生種子給二維陣列賦值。