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
| // i is index of array,the left child index is 2*i+1,the right one is 2*i+2,the father index is floor((i-1)/2)
void siftDown(int *a, int i, int n)
{
int lhs=2*i+1;
int rhs=2*i+2;
int maxid=i;
if(lhs<n && a[maxid]<a[lhs]) maxid=lhs;
if(rhs<n && a[maxid]<a[rhs]) maxid=rhs;
if(maxid!=i)
{
swap(a[i],a[maxid]);
siftDown(a,maxid,n);
}
}
// void makeHeap(int *a, int n){
// for(int i=n/2-1; i>=0; i--)
// {
// siftDown(a,i,n);
// }
// }
void heap_sort(int *a,int n){
// makeHeap(a,n);
for(int i=n/2-1; i>=0; i--){
siftDown(a,i,n);
}
for(int i=n-1; i>0; i--){
swap(a[0],a[i]);
siftDown(a,0,i);
}
}
|