PTA做業:1.選擇排序法 2.找鞍點

做業一:選擇排序 一.試題:本題要求將給定的n個整數從大到小排序後輸出。 輸入格式: 輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。 輸出格式: 在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多餘空格。 輸入樣例: 4 5 1 7 6 輸出樣例: 7 6 5 1 二.分析:1.本題與教材上的示例有所不一樣,須要將一組結果從大到小輸出 實際上所使用的思路與原理是同樣的! 2.須要嚴重注意的是題目中行末不容許有空格,不然該題會所有報錯! 三.因爲原理在上課的時候老師已經說過,因此直接附上執行代碼吧:ios

#include<iostream>
  using namespace std; 
  main()
{
	int temp,i,j,n;
	int a[100];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++) //本處就是表明從第一個數到最後一個數,找出最大值,然後從第二個數到最後一個數,找出最大值......以此類推
		{
			if(a[j]>a[i])
			{
			temp=a[j];//本處就是
			a[j]=a[i];//將最大數
			a[i]=temp;	//與上述要求的數交換
			}
		}
    }
    for(i=0;i<n;i++){
    printf("%d",a[i]);
    if(i!=n-1)
    printf(" ");//本處即保證行末無空格
    }
}

四.運行正確截圖 五.總結:本題是一次性經過,而且難度不是很大,所以對照教材仿寫便可,可是咱們須要弄清楚其原理,這樣才能算是掌握了該算法的排序!算法

做業二:找鞍點 一.試題:找鞍點 (20 分) 一個矩陣元素的「鞍點」是指該位置上的元素值在該行上最大、在該列上最小。 本題要求編寫程序,求一個給定的n階方陣的鞍點。 輸入格式: 輸入第一行給出一個正整數n(1≤n≤6)。隨後n行,每行給出n個整數,其間以空格分隔。 輸出格式: 輸出在一行中按照「行下標 列下標」(下標從0開始)的格式輸出鞍點的位置。若是鞍點不存在,則輸出「NONE」。題目保證給出的矩陣至多存在一個鞍點。 輸入樣例1: 4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 輸出樣例1: 2 1 輸入樣例2: 2 1 7 4 1 輸出樣例2: NONE 二.分析:本題的難度稍高,實際上其原理很簡單,就是逐行找出每行中最大的數,然後把該數與其所在的列中數進行比較,看是否爲列中最小的數,若知足這些條件就可將該數輸出 若不知足,輸出NONE 三.因爲代碼行較多,因此詳情直接附在代碼上:數組

#include <iostream>
 using namespace std; 
 int main()
{
    int a[88][99];
    int n;
    scanf("%d",&n);
    int i,j;
   for(i=0; i<n; i++)
        for(j=0; j<n; j++)
        {
            scanf("%d",&a[i][j]);
        }
    int k=0,x=0,sks=1,q=0;//k爲鞍點的最小值列標 
    if(n==1)
        printf("0 0");//若只是一個一階矩陣,則鞍點就是其自己 
    else
    {
        for(i=0; i<n; i++)
        {
            x=i;
            for(q=0; q<n; q++)//找行得最大值 
            {
                if(a[i][k]<=a[i][q])//數組元素之間比較,比a[i][k]大,就把列標賦給k 
                {
                    k=q;
                }
            }
            for(j=0; j<n; j++)//判斷是否爲列中的最小值 
            {
                if(a[x][k]>a[j][k])//若此行最大值不是列所在的最小值,把小的行標賦給x 
                {
                    x=j;
                    break;
                }
            }
            if(i==x)//行中最大且列中最小,判斷條件行標不改變 
            {
                sks=0;
                break;
            }
        }
        if(sks==0)
            printf("%d %d",i,k);//i爲鞍點行數,k爲鞍點列數 
        else printf("NONE");
    }
    return 0;
}

四.運行結果正確截圖 五.流程圖: 六.總結:本題調試了不少次,最後仍是借閱了一網友的資源將問題解決的,可能仍是本身所考慮到的各類狀況不周到,從此仍是要多加思考,將思惟能力鍛煉出來 做業三:冒泡法排序 一.試題7-1 冒泡法排序 (10 分) 輸入1個正整數n(1<=n<=10),而後輸入n個整數並存放在數組中,將這n個整數從大到小排序後輸出,相鄰數字間有一個空格,行末不得有多餘空格。 輸入格式: 輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。 輸出格式: 在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多餘空格。 輸入樣例: 4 75 71 77 76 輸出樣例: 77 76 75 71 二.分析:本題代碼與選擇排序法的代碼類似,可是原理與選擇排序法是大相徑庭的,本題是一組數中的後一個數與前一個數相互比較,若是後一個數比前一個數大,則調換其位置 三.執行代碼學習

#include<iostream>//請各位讀者相信,本題代碼毫不是copy而來
 using namespace std;
 main()
{
	int n,a[99];
	int i,j,middle;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(i=1;i<n;i++){   //外層循環
	for(j=0;j<n-i;j++)//內層循環
	if(a[j]<a[j+1]){
		middle=a[j];a[j]=a[j+1];a[j+1]=middle;//後一個數與前一個數相互比較,若是後一個數比前一個數大,則調換其位置
	}
    }
	for(i=0;i<n;i++){
	printf("%d",a[i]);
	if(i!=n-1)
		printf(" ");//此處迎合PTA要求的格式
    }
	return 0;
}

四.總結,本題的難度不是太大,由於已經學習過了選擇排序法,因此弄明白了其原理難度並不大spa

相關文章
相關標籤/搜索