码迷,mamicode.com
首页 > 其他好文 > 详细

PAT1035. 插入与归并(25)

时间:2015-01-20 13:38:11      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

根据维基百科的定义:

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

归并排序进行如下迭代操作:首先将原始序列看成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 }
View Code

 

PAT1035. 插入与归并(25)

标签:

原文地址:http://www.cnblogs.com/GoFly/p/4235802.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!