-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy path09-排序2 Insert or Merge.c
135 lines (116 loc) · 3.19 KB
/
09-排序2 Insert or Merge.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
ElementType *ReadInput(int N);
void solve(ElementType A[], ElementType ansArr[], int N);
void PrintArr(ElementType A[], int N);
void Merge(ElementType A[], ElementType TmpA[], int L, int R, int RightEnd);
void Merge_pass(ElementType A[], ElementType TmpA[], int N, int length);
int Check_Insertion_Sort(ElementType A[], ElementType ansArr[], int N);
void Merge_Sort(ElementType A[], ElementType ansArr[], int N);
int main()
{
int N;
ElementType *arr, *ansArr;
scanf("%d", &N);
arr = ReadInput(N);
ansArr = ReadInput(N);
solve(arr, ansArr, N);
free(arr);
free(ansArr);
return 0;
}
ElementType *ReadInput(int N)
{
ElementType *arr;
int i;
arr = (ElementType *)malloc(sizeof(ElementType) * N);
for (i = 0 ; i < N; ++i)
scanf("%d", &arr[i]);
return arr;
}
void PrintArr(ElementType A[], int N)
{
int i;
for ( i = 0; i < N - 1; ++i)
printf("%d ", A[i]);
printf("%d", A[i]);
}
void solve(ElementType A[], ElementType ansArr[], int N)
{
if (Check_Insertion_Sort(A, ansArr, N)) { // 判断是否为插入排序
printf("Insertion Sort\n");
PrintArr(ansArr, N);
}
else { // 此时一定是归并排序
Merge_Sort(A, ansArr, N);
printf("Merge Sort\n");
PrintArr(A, N);
}
}
void Merge(ElementType A[], ElementType TmpA[], int L, int R, int RightEnd)
{
int LeftEnd, Tmp;
LeftEnd = R - 1;
Tmp = L;
while (L <= LeftEnd && R <= RightEnd) {
if (A[L] < A[R])
TmpA[Tmp++] = A[L++];
else
TmpA[Tmp++] = A[R++];
}
while (L <= LeftEnd) TmpA[Tmp++] = A[L++];
while (R <= RightEnd) TmpA[Tmp++] = A[R++];
}
void Merge_pass(ElementType A[], ElementType TmpA[], int N, int length)
{
int i, j;
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);
else
for (j = i; j < N; ++j) TmpA[j] = A[j];
}
void Merge_Sort(ElementType A[], ElementType ansArr[], int N)
{
int i, small_length, length;
small_length = N;
length = 1;
for (i = 0; i < N - 1; ++i) {
if (ansArr[i] > ansArr[i + 1]) {
small_length = length < small_length ? length : small_length;
length = 1;
continue;
}
++length;
}
small_length -= small_length % 2;
if (small_length < N)
Merge_pass(ansArr, A, N, small_length);
}
int Check_Insertion_Sort(ElementType A[], ElementType ansArr[], int N)
{
int i, pos, flag;
ElementType tmp;
flag = 1;
for (i = 0; i < N - 1; ++i) { // 找到第一个非有序位置
if (ansArr[i] > ansArr[i + 1]) {
pos = i + 1;
break;
}
}
for (i = pos; i < N; ++i) { // 判断非有序部分是否和输入数据对应位置一样
if (A[i] != ansArr[i]) {
flag = 0;
break;
}
}
if (flag) { // 如果是插入排序,进行下一次插入排序操作
tmp = ansArr[pos];
for (; pos > 0 && tmp < ansArr[pos - 1]; --pos)
ansArr[pos] = ansArr[pos - 1];
ansArr[pos] = tmp;
}
return flag;
}