#include<iostream>
#include<cstdlib>
using namespace std;
#define N 5
void swap(int *a,int j,int i)
{
int buf=a[j];
a[j] = a[i];
a[i] = buf;
}
void printArray(int *a,int len)
{
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void heapInsert(int *a, int idx)
{
while(a[idx] > a[(idx-1)/2])
{
swap(a,idx,(idx-1)/2);
idx=(idx-1)/2;
}
}
//从上往下开始,依次将每个节点的左右子节点中的最大值与父节点比较,如果父节点较小,将父节点和子节点中的最大值交换,并将当前节点移动到子节点中较大节点的位置上。并将左节点移动做相应移动。
void heapify(int *a,int idx,int len)
{
int left=idx*2+1;
while(left<len)
{
int largest = left +1 < len && a[left+1] > a[left] ? left+1 : left;
largest = a[largest] > a[idx] ? largest: idx;
if(largest == idx)
break;
swap(a,idx,largest);
idx = largest;//???
left = idx *2 +1;
}
}
void heapSort(int *a, int len)
{
//构造大根堆
for(int i=0;i<len;i++)
heapInsert(a,i);
int size = len;
swap(a,0,--size);
while(size > 0)
{
heapify(a,0,size);
swap(a,0,--size);
}
}
int main()
{
//int a[N]={6,7,8,1,2,3,4,1,0,7,1,4,5,11,31};
int b[N] = {1,2,3,4,5};
heapSort(b,N);
printArray(b,N);
return 0;
}
#include<cstdlib>
using namespace std;
#define N 5
void swap(int *a,int j,int i)
{
int buf=a[j];
a[j] = a[i];
a[i] = buf;
}
void printArray(int *a,int len)
{
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void heapInsert(int *a, int idx)
{
while(a[idx] > a[(idx-1)/2])
{
swap(a,idx,(idx-1)/2);
idx=(idx-1)/2;
}
}
//从上往下开始,依次将每个节点的左右子节点中的最大值与父节点比较,如果父节点较小,将父节点和子节点中的最大值交换,并将当前节点移动到子节点中较大节点的位置上。并将左节点移动做相应移动。
void heapify(int *a,int idx,int len)
{
int left=idx*2+1;
while(left<len)
{
int largest = left +1 < len && a[left+1] > a[left] ? left+1 : left;
largest = a[largest] > a[idx] ? largest: idx;
if(largest == idx)
break;
swap(a,idx,largest);
idx = largest;//???
left = idx *2 +1;
}
}
void heapSort(int *a, int len)
{
//构造大根堆
for(int i=0;i<len;i++)
heapInsert(a,i);
int size = len;
swap(a,0,--size);
while(size > 0)
{
heapify(a,0,size);
swap(a,0,--size);
}
}
int main()
{
//int a[N]={6,7,8,1,2,3,4,1,0,7,1,4,5,11,31};
int b[N] = {1,2,3,4,5};
heapSort(b,N);
printArray(b,N);
return 0;
}