P1177 【模板】排序

題目:
https://www.luogu.com.cn/problem/P1177

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
#include <bits/stdc++.h>
using namespace std;

vector<int> v(100005, 0);

void HeapSort(int size);
void HeapInsert(int i);
void heapify(int i, int size);
void swap(int a, int b);

int main(){
ios::sync_with_stdio(0);
cin.tie(0);

int n;
cin >> n;

for(int i=0; i<n; ++i) cin >> v[i];

HeapSort(n);

for(int i=0; i<n; ++i){
if(i != 0) cout << ' ';
cout << v[i];
}
cout << '\n';

return 0;
}

void HeapSort(int size){
for(int i=(size-1)/2; i >= 0; --i){
heapify(i, size);
}

int n = size;
while(n > 1){
swap(0, --n);
heapify(0, n);
}
}

void HeapInsert(int i){
while(v[i] > v[(i-1)/2]){
swap(i, (i-1)/2);
i = (i-1)/2;
}
}

void heapify(int i, int size){
int l = i*2+1;
while(l < size){
int best = (l+1 < size && v[l+1] > v[l]) ? l+1 : l;
best = (v[best] > v[i]) ? best : i;
if(best == i) break;
swap(best, i);
i = best;
l = i*2+1;
}
}

void swap(int a, int b){
int tmp = v[a];
v[a] = v[b];
v[b] = tmp;
}