PAT B 1035および挿入マージ

件名の説明:

Wikipediaの定義によると:

  • 挿入ソート徐々に順序付けられた出力シーケンスを生成する、いずれかで入力データ1を得るために、反復アルゴリズムです。各反復アルゴリズム入力シーケンスから採取された要素は、順序付けられたシーケンス内の正しい位置に挿入します。オーダー内のすべての要素になるまで反復がそう。
  • ソートマージ Nの元のシーケンスは、唯一つの元素を含有し、順序付け、マージの各反復隣接配列、順序付け最後まで唯一サブシーケンスを命じたように、まず、次の反復操作をシーケンス。

今、元の配列とソートアルゴリズムによって生成された中間のシーケンスを与えられ、アルゴリズムは、ソートアルゴリズムのかどうか、あなたがどのような種類を決定しますか?

入力フォーマット:

入力の最初の行にN(≦100)の整数正が与えられ、その後、N個の整数の元の配列の行を与え、最後の行は、ソートアルゴリズムの中間体によって生成されたシーケンスを与えます。標的配列が昇順にソートされているものとします。数字の間のスペースで区切られています。

出力フォーマット:

まず、出力ライン1挿入ソートこれは、挿入ソートを表し、またはマージソートこれは、マージソートを表し;次いでランク付けアルゴリズム出力反復2行目の結果の配列。トピックは、各テストの結果が一意であることを確認してください。数字の間にスペースで区切って、最初から最後までのラインは、余分なスペースを持っていないかもしれません。

サンプル入力1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 4 7 8 9 5 4 6 0

出力サンプル1:

挿入ソート
1 2 3 5 7 8 9 4 6 0

サンプル入力2:

10
3 1 2 8 7 5 9 0 4 6
1 3 2 8 5 7 4 9 0 6

出力サンプル2:

マージソート
1 2 3 4 5 8 7 9 0 6

分析:

そして、非再帰的なアルゴリズムの挿入ソートとマージソートを習得する必要があります。
ソート与えられた契約の現在のパスは、フラグは、その後、ソートして終了への旅行をtrueに設定されている場合、ソートのソートに次の旅行を得るために、私は、裁判官の順序をマーキングフラグに参加することを選択します。

コード:

#include <cstdio>
#include <algorithm>
using namespace std;

//判断数组内容是否相同
bool isSame(int a[], int b[], int n){
    for(int i = 0; i < n; i++)
        if(a[i] != b[i])
            return false;
    return true;
}

//插入排序
bool insertSort(int a[], int b[], int n){
    int temp, j;
    //flag用来判断是否该次排序是否已经与test相同,若相同,则再进行一次排序,存在a中
    bool flag = false;
    int count = 0;
    for(int i = 1; i < n; i++){
        count++;
        temp = a[i];
        for(j = i; j > 0; j--){
            if(a[j - 1] > temp)
                a[j] = a[j - 1];
            else
                break;
        }
        a[j] = temp;
        if(isSame(a, b, n))
            flag = true;
        else if(flag)
            return true;
    }
    return flag;
}

//归并排序非递归
bool mergeSort(int a[], int b[], int n){
    int count = 1;
    //flag用来判断是否该次排序是否已经与test相同,若相同,则再进行一次排序,存在a中
    bool flag = false;
    while(count * 2 <= n){
        count *= 2;
        int left = 0, right = count - 1;
        while(right <= n - 1){
            sort(a + left, a + right + 1);
            if(right >= n - 1)
                break;
            left += count;
            right = right + count >= n - 1 ? n - 1 : right + count;

        }
        if(isSame(a, b, n))
            flag = true;
        else if(flag)
            return true;
    }
    return flag;
}

//输出数组
void printArray(int a[], int n){
    bool flag = false;
    for(int i = 0; i < n; i++){
        if(!flag){
            flag = true;
            printf("%d", a[i]);
        }
        else
            printf(" %d", a[i]);
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    int num[n], temp[n], test[n];   //num, temp均为初始数组,test为经过排序后的内容
    for(int i = 0; i < n; i++){
        scanf("%d", &num[i]);
        temp[i] = num[i];
    }
    for(int i = 0; i < n; i++)
        scanf("%d", &test[i]);
    bool isInsertSort = insertSort(temp, test, n);  //选择用插入排序判断是否为该方法
    if(!isInsertSort){
        //若不为插入排序,需要进行归并排序
        printf("Merge Sort\n");
        mergeSort(num, test, n);
        printArray(num, n);
    }
    else{
        //若为插入排序,则可直接输出传入的temp数组
        printf("Insertion Sort\n");
        printArray(temp, n);
    }
    return 0;
}

公開された10元の記事 ウォンの賞賛0 ビュー114

おすすめ

転載: blog.csdn.net/qq_41421484/article/details/104010298