件名の説明:
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;
}