PAT1035. 插入与归并(25)

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。

输入样例1:

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

输出样例1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例2:

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

输出样例2:

Merge Sort
1 2 3 8 4 5 7 9 0 6思路:迭代时注意 要不同,一定要注意理解题意。

  1 #include<stdio.h>
  2 int origin[110];
  3 int middle[110];
  4 int temp[110];
  5 bool Judge(int number)
  6 {
  7     for(int i=0;i<number;i++)
  8        if(temp[i]!=middle[i])
  9            return false;
 10     return true;
 11 }
 12 bool Insert(int number)
 13 {
 14     bool flag=false;
 15     for(int i=0;i<number;i++)
 16     {
 17         temp[i]=origin[i];
 18     }
 19     for(int i=0;i<number;i++)
 20     {
 21         int j;
 22         int te=temp[i];
 23         for(j=i-1;j>=0;j--)
 24         {
 25             if(te>=temp[j])
 26             {
 27                 break;
 28             }
 29             else
 30                 temp[j+1]=temp[j];
 31         }
 32         temp[j+1]=te;
 33         if(flag&&!Judge(number))
 34             return true;
 35         if(Judge(number))
 36         {
 37             flag=true;
 38         }
 39
 40     }
 41     return flag;
 42 }
 43 //最后剩余一部分也需要进行排序
 44 bool Merge(int number)
 45 {
 46     int interval=2;
 47     for(int i=0;i<number;i++)
 48     {
 49         temp[i]=origin[i];
 50     }
 51     int i;
 52     bool flag=false;
 53     bool sec=false;
 54     while(interval<=number)
 55     {
 56         //每一轮排序
 57         for(i=0;i<number;i+=interval)
 58        {
 59             if(i+interval>number)//change
 60             {
 61                 break;
 62             }
 63                for( int j=i;j<i+interval;j++)
 64             {
 65                 int de=temp[j];
 66                   int k;
 67                 for(k=j-1;k>=i;k--)
 68                   {
 69                        if(de>=temp[k])
 70                     {
 71                          break;
 72                     }
 73                     else
 74                        temp[k+1]=temp[k];
 75                    }
 76                    temp[k+1]=de;
 77                 if(Judge(number))
 78                 {
 79                   flag=true;
 80                 }
 81              }
 82           }
 83           //剩下几个进行排序
 84            if(i+interval>number&&i<number)
 85            {
 86                   // i-=interval;
 87                 //进行插入排序
 88                 for(int j=i;j<number;j++)
 89                 {
 90                     int k;
 91                     int qe=temp[j];
 92                     for(k=j-1;k>=i;k--)
 93                     {
 94                         if(qe>=temp[k])
 95                            break;
 96                         else
 97                            temp[k+1]=temp[k];
 98                     }
 99                     temp[k+1]=qe;
100                       if(Judge(number))
101                     {
102                   flag=true;
103                     }
104                 }
105
106            }
107             //~~~~~~
108             if(sec&&!Judge(number))
109             {
110                  return true;
111             }
112             if(flag)
113                  sec=true;
114             interval*=2;
115        }
116     //if(sec)
117     //最后一次总体排序
118        for(int k=0;k<number;k++)
119     {
120         int j;
121         int te=temp[k];
122         for(j=k-1;j>=0;j--)
123         {
124             if(te>=temp[j])
125             {
126                 break;
127             }
128             else
129                 temp[j+1]=temp[j];
130         }
131         temp[j+1]=te;
132         if(flag&&!Judge(number))
133             return true;
134         if(Judge(number))
135         {
136             flag=true;
137             return true;
138         }
139     }
140     return false;
141 }
142
143 int main(int argc, char *argv[])
144 {
145     int count;
146     scanf("%d",&count);
147     for(int i=0;i<count;i++)
148     {
149         scanf("%d",&origin[i]);
150     }
151     for(int i=0;i<count;i++)
152     {
153         scanf("%d",&middle[i]);
154     }
155     if(Insert(count))
156     {
157         printf("Insertion Sort\n");
158         for(int i=0;i<count;i++)
159         {
160             if(i!=count-1)
161                printf("%d ",temp[i]);
162             else
163                printf("%d\n",temp[i]);
164         }
165     }
166
167     else if(Merge(count))
168     {
169         printf("Merge Sort\n");
170         for(int i=0;i<count;i++)
171         {
172             if(i!=count-1)
173                printf("%d ",temp[i]);
174             else
175                printf("%d\n",temp[i]);
176         }
177     }
178        return 0;
179 }

时间: 2024-08-10 16:43:09

PAT1035. 插入与归并(25)的相关文章

1035. 插入与归并(25)

1035. 插入与归并(25) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100):随后一

PAT-乙级-1035. 插入与归并(25)

1035. 插入与归并(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定

Programming Ability Test学习 1035. 插入与归并(25)

1035. 插入与归并(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定

PAT 1035. 插入与归并(25)

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100):随后一行给出原始序列的N个整数:最后一

PAT1035—— 插入与归并

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100):随后一行给出原始序列的N个整数:最后一

P 1035 插入与归并

转跳点 :?? 1035 插入与归并 (25分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正

PAT-B 1035. 插入与归并

题目内容: 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100):随后一行给出原始序列的N个

排序算法-冒泡、插入、归并、希尔、快速、选择--代码总结

冒泡排序代码: #include <iostream> #include <string> using namespace std; template<class ItemType> void bubbleSort(ItemType theArray[], int n) { bool sorted = false; // False when swaps occur int pass = 1; while (!sorted && (pass < n

1035 插入与归并 (25 分)

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数 N (≤100):随后一行给出原始序列的 N