09-排序2 Insert or Merge

来源:互联网 发布:淘宝折扣卷哪里找 编辑:程序博客网 时间:2024/05/18 03:24
#include <stdio.h>#include <stdlib.h>void Insertion_Sort(int A[], int N);void Merge_pass(int A[], int tmpA[], int N, int length);void Merge(int A[], int tmpA[], int L, int R, int RightEnd);int compare(int a[], int b[], int N){for (int i = 0; i < N; i++){if (a[i] != b[i])return 0;}return 1;}void print(int a[], int N){for (int i = 0; i < N; i++){if (i == 0)printf("%d", a[i]);elseprintf(" %d", a[i]);}}int main(int argc, char const *argv[]){// freopen("test.txt", "r", stdin);int N;scanf("%d", &N);int a1[N], a2[N], b[N];for (int i = 0; i < N; i++){scanf("%d", &a1[i]);a2[i] = a1[i];}for (int i = 0; i < N; i++)scanf("%d", &b[i]);for (int i = 2; i <= N; i++){//要从2开始,不然测试点3(有测试点0的话就是测试点2)过不了Insertion_Sort(a1, i);if (compare(a1, b, N)){Insertion_Sort(a1, i+1);printf("Insertion Sort\n");print(a1, N);return 0;}}int *tmp = (int*)malloc(sizeof(int)*N);for (int length = 1; length < N; ){Merge_pass(a2, tmp, N, length);length *= 2;if (compare(tmp, b, N)){Merge_pass(tmp, a2, N, length);printf("Merge Sort\n");print(a2, N);return 0;}Merge_pass(tmp, a2, N, length);length *= 2;if (compare(a2, b, N)){Merge_pass(tmp, a2, N, length);printf("Merge Sort\n");print(tmp, N);return 0;}}return 0;}void Insertion_Sort(int A[], int N){for (int P = 1; P < N; P++){int tmp = A[P];int i;for (i = P; i > 0 && A[i-1] > tmp; i--)A[i] = A[i-1];A[i] = tmp;}}void Merge_pass(int A[], int tmpA[], int N, int length){int i;for (i = 0; i <= N-2*length; i += 2*length)Merge(A, tmpA, i, i+length, i+2*length-1);if (i+length < N)Merge(A, tmpA, i, i+length, N-1);elsefor (int j = i; j < N; j++)tmpA[j] = A[j];}void Merge(int A[], int tmpA[], int L, int R, int RightEnd){int LeftEnd = R - 1;int tmp = L;int Number = RightEnd - L + 1;while (L <= LeftEnd && R <= RightEnd){if (A[L] <= A[R])tmpA[tmp++] = A[L++];elsetmpA[tmp++] = A[R++];}while (L <= LeftEnd)tmpA[tmp++] = A[L++];while (R <= RightEnd)tmpA[tmp++] = A[R++];for(int i = 0; i < Number; i++, RightEnd--)//L, R have changedA[RightEnd] = tmpA[RightEnd];}

0 0