-
Notifications
You must be signed in to change notification settings - Fork 0
/
1098.cpp
135 lines (123 loc) · 1.97 KB
/
1098.cpp
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
/*
在case2卡了很久, 对比了网上可以AC的程序, 判断case2应该是如下类似情况
Input:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
Output:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
如果是如下情况
Input:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 5 7 8 9 4 6 0
正确的输出应该是
Output:
Insertion Sort
1 2 3 4 5 7 8 9 6 0
而不是
Output:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
*/
#include <iostream>
using namespace std;
int N;
int initial[105];
int sequence[105];
int pos = 0;
void swap_sequence(int pos_a, int pos_b)
{
int temp = sequence[pos_a];
sequence[pos_a] = sequence[pos_b];
sequence[pos_b] = temp;
return ;
}
/* 修正最大堆*/
void max_heapify(int pos, int size)
{
int l = pos*2+1;
int r = pos*2+2;
int largest;
if (l < size && sequence[l] > sequence[pos])
{
largest = l;
}
else
{
largest = pos;
}
if (r < size && sequence[r] > sequence[largest])
{
largest = r;
}
if (largest != pos)
{
swap_sequence(pos, largest);
max_heapify(largest, size);
}
}
/* 这个函数执行之后 pos >= 1*/
bool isInsertionSort()
{
pos = N-1;
while (pos != 0 && sequence[pos] == initial[pos]) /* 如果这里没有pos != 0, case2也不能通过*/
{
--pos;
}
++pos;
for (int i = 1; i < pos; ++i)
{
if (sequence[i-1] > sequence[i])
{
return false;
}
}
return true;
}
int main()
{
cin >> N;
for (int i = 0; i != N; ++i)
{
cin >> initial[i];
}
for (int i = 0; i != N; ++i)
{
cin >> sequence[i];
}
if (isInsertionSort())
{
cout << "Insertion Sort" << endl;
/* 如果没有下面这个while循环, case2通不过*/
while (pos != N-1 && sequence[pos] > sequence[pos-1])
{
++pos;
}
while (pos != 0 && sequence[pos] < sequence[pos-1])
{
swap_sequence(pos, pos-1);
--pos;
}
}
else
{
cout << "Heap Sort" << endl;
pos = N-1;
while (sequence[0] < sequence[pos] && sequence[pos-1] < sequence[pos])
{
--pos;
}
swap_sequence(0, pos);
max_heapify(0, pos);
}
cout << sequence[0];
for (int i = 1; i != N; ++i)
{
cout << ' ' << sequence[i];
}
cout << endl;
system("pause");
return 0;
}