70011
This presentation is the property of its rightful owner.
Sponsored Links
1 / 8

70011 对一个 有序的数组 , 输入一个整数 x, 把 x 插入到这组数据中 , 使该组数据仍然有序 PowerPoint PPT Presentation


  • 43 Views
  • Uploaded on
  • Presentation posted in: General

70011 对一个 有序的数组 , 输入一个整数 x, 把 x 插入到这组数据中 , 使该组数据仍然有序. 输入 n,a,x. 例 数组 a: 1 3 5 7 9 插入 6. a[n-1]<x. i=0. a[n]=x. 解法 1. a[i]<x. 找到插入数的位置 插入数位置后的数后移 插入数. i++. j=n-1,n-2,…i. a[j+1]=a[j]. 1 3 5 7 9. j. a[i]=x. 1 3 5 7 7 9. 1 3 5 6 7 9. 输出 a. #include <stdio.h> void main()

Download Presentation

70011 对一个 有序的数组 , 输入一个整数 x, 把 x 插入到这组数据中 , 使该组数据仍然有序

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


70011 x x

70011 对一个有序的数组,输入一个整数 x,把 x 插入到这组数据中,使该组数据仍然有序

输入n,a,x

例 数组a: 1 3 5 7 9

插入 6

a[n-1]<x

i=0

a[n]=x

解法1

a[i]<x

找到插入数的位置

插入数位置后的数后移

插入数

i++

j=n-1,n-2,…i

a[j+1]=a[j]

1 3 5 7 9

j

a[i]=x

1 3 5 7 7 9

1 3 5 6 7 9

输出a


70011 x x

#include <stdio.h>

void main()

{int i,j,n,x,a[100];

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

scanf("%d",&x);

if(a[n-1]<x) a[n]=x;

else

{i=0;

while(a[i]<x)i++;

for(j=n-1;j>=i;j--)

a[j+1]=a[j];

a[i]=x;

}

for(i=0;i<=n;i++)

printf("%d ", a[i]);

}

输入n,a,x

a[n-1]<x

i=0

a[n]=x

a[i]<x

i++

j=n-1,n-2,…i

a[j+1]=a[j]

j

a[i]=x

输出a


70011 x x

解法2

1 3 5 7 9

1 3 5 6 9

1 3 5 6 7 9

找到插入数的位置

插入数与找到位置上交换

6

7

#include <stdio.h>

void main()

{int i,n,x,a[100],t;

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

scanf("%d",&x);

for(i=0;i<n;i++)

if(a[i]>x)

{t=a[i];a[i]=x;x=t;}

a[n]=x;

for(i=0;i<=n;i++)

printf("%d ", a[i]);

}

输入n,a,x

i=0,1,…n-1

a[i]>x

t=a[i]

a[i]=x

x=t

i

a[n]=x

输出a


70011 x x

解法3

1 3 5 7 9 6

1 3 5 7 6 9

1 3 5 6 7 9

插入数存入数组的最后

从后起两两相比交换位置

#include <stdio.h>

void main()

{int i,n,x,a[100],t;

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

scanf("%d",&x);

a[n]=x;

for(i=n-1;i>=0;i--)

if(a[i+1]<a[i])

{t=a[i+1];a[i+1]=a[i];a[i]=t;}

for(i=0;i<=n;i++)

printf("%d ", a[i]);

}

输入n,a,x

a[n]=x

i=n-1,n-2,..0

a[i+i]>a[i]

t=a[i+1]

a[i+1]=a[i]

a[i]=t

i

输出a


70011 x x

1

输入a

k=1;k<n;k++

i=0;i<n;i++

0

a[row][col]>a[k][col]

col=0

1

j=1;j<n;j++

row=k

0

a[i][col]<a[i][j])

k

1

0

row==i

col=j

1

输出i,col

j

row=0

i

1

输出NO

70026找矩阵的鞍点(元素值在该行上最大, 在该列上最小)

解法一:

1.固定i行,在i行找到最大元素的列j=>col

2.在col列找到最小元素的行k=>row

3.如i==row,则鞍点为row行col列

void main()

{int i,j,k,row,col,flag=0,n;

int a[6][6];

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

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

for(i=0;i<n;i++)

{col=0;

for(j=1;j<n;j++)

if(a[i][col]<a[i][j])col=j;

row=0;

for(k=1;k<n;k++)

if(a[i][col]>a[k][col])row=k;

if(row==i) {flag=1;break;}

}

if(flag)

printf("i=%d,j=%d",row,col);

else printf("NO");

}


70011 x x

……

…… aij ……

……

解法二:

对每个元素判别是否鞍点

1.固定i行j列的元素aij

2.对i行求出列最大值max

3.对j列求出列最小值min

4.若 max==min==aij

则鞍点为i行j列

#include "stdio.h"

int main(void)

{int flag, i, j, k, n,row,col,max, min; int a[6][6];

scanf("%d", &n);

for(i = 0; i < n; i++)

for(j = 0; j < n; j++) scanf("%d", &a[i][j]);

flag=0;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{max=a[i][0];

for(k=1;k<n;k++) if(max<a[i][k]) max=a[i][k];

min=a[0][j];

for(k=1;k<n;k++) if(min>a[k][j]) min=a[k][j];

if(max==min&&max==a[i][j])

{flag=1;row=i;col=j; goto ll;}

}

ll: if(flag != 0)

printf("a[%d][%d] = %d\n", row, col,a[row][col]);

else

printf("NO\n");

}


70011 x x

maxj

max

1 7 4 1

4 8 3 6

1 6 1 2

0 7 8 9

1

1

1

3

7

8

6

0

mixi

3

2

2

0

0

6

1

1

max[2]=6 i=2 maxj[2]=1 == j

min[1]=6 j=1 mini[1]=2 == i

解法三:

1.求出每行的最大值, 并记住行列

max[n-1] maxj[n-1] max对应的下标

最大值 列位置 行位置

2.求出每列的最小值, 并记住行列

min[n-1] mini[n-1] min对应的下标

最小值 行位置 列位置

3.若 max[i]==min[j] (i为行,j为列)

并 maxj[i]==j

mini[j]==i

则鞍点为i行j列

min


70011 x x

#include<stdio.h>

void main()

{int n,i,j;

int a[6][6],max[6],maxj[6];

int min[6],mini[6];

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

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

for(i=0;i<n;i++)

{max[i]=a[i][0];

maxj[i]=0;

for(j=1;j<n;j++)

if(max[i]<a[i][j])

{max[i]=a[i][j];maxj[i]=j;}

}

for(j=0;j<n;j++)

{min[j]=a[0][j];

mini[j]=0;

for(i=1;i<n;i++)

if(min[j]>a[i][j])

{min[j]=a[i][j];mini[j]=i;}

}

for(i=0;i<n;i++)

for(j=0;j<n;j++)

if(max[i]==min[j]&&maxj[i]==j

&&mini[j]==i)

{printf("%d %d\n",i,j);

return;

}

printf("no\n");

}


  • Login