标签:
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成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 }
标签:
原文地址:http://www.cnblogs.com/GoFly/p/4235802.html