多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如下迭代操作:首先将原始序列看成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 代码如下: #include<stdio.h> #include<stdlib.h> void merge(int l, int r, int a[], int *tempa, int rightend) { int tem = l; int leftend = r - 1; int elementnum = rightend - l + 1; int i; while (l <= leftend&&r <= rightend) { if (a[l] <a[r]) { tempa[tem++] = a[l++]; } else { tempa[tem++] = a[r++]; } } while (l <= leftend) { tempa[tem++] = a[l++]; } while (r <= rightend) { tempa[tem++] = a[r++]; } for (i = 0; i < elementnum; i++, rightend--){ a[rightend] = tempa[rightend]; } } void mergepass(int tempa[], int a[], int n, int length) { int i,j; for (i = 0; i <= n - 2 * length; i += 2 * length) { merge(i, i + length, a, tempa, i + 2 * length - 1); } if (i + length < n) { merge(i, i + length, a, tempa, n - 1); } else for (j = i; j < n; j++) { tempa[j] = a[j]; } } void merge_sort(int *a, int n) { int *tempa; int length = 1; int i; tempa = (int *)malloc(sizeof(int)*n); while (length < n) { mergepass(tempa, a, n, length); length *= 2; mergepass(a, tempa, n,length); length *= 2; } free(tempa); } int main() { int a[105],ai[105],ag[105],n,temp,i,j,k,count,flag=0; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d", a + i); ag[i] = a[i]; } for (i = 0; i < n; i++) { scanf("%d", ai + i); } /*一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置 ⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 ⒌ 将新元素插入到下一位置中 ⒍ 重复步骤2~5*/ for (i = 1; i < n; i++) { if (flag == 1) { flag++; } count = 0; temp = a[i]; j = i - 1; while (j >= 0 && a[j] >temp) { a[j+1] = a[j ]; j--; } if (j != i - 1) { a[j + 1] = temp; } if (flag == 2) { for (k = 0; k < n; k++) { if (k != n - 1) printf("%d ", a[k]); else printf("%d", a[k]); } return 0; } for (k = 0; k < n; k++) { if (a[k] == ai[k]&&flag!=2) { count++; } else break; } if (count == n) { flag = 1; printf("Insertion Sort\n"); } } /*归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置 第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针超出序列尾 将另一序列剩下的所有元素直接复制到合并序列尾*/ int tempa[105],length=1,countg=0; while (length < n) { if (flag == 1) { flag++; } countg = 0; mergepass(tempa, ag, n, length); if (flag == 2) { for (k = 0; k < n; k++){ if (k != n - 1) printf("%d ", ag[k]); else printf("%d", ag[k]); } return 0; } for (i = 0; i < n; i++) { if (ag[i] == ai[i]) { countg++; } } if (countg == n){ flag = 1; printf("Merge Sort\n"); } length *= 2; } return 0; }