/*=============================================================================
#
# FileName: HeapSort.cpp
# Desc: 堆排序。数组的序号从1到len,长度为len+1。
#
# Author: yulu
# Email: 187373778@qq.com
#
# Created: 2014-05-16 16:20:00
# Version: 0.0.1
# History:
# 0.0.1 | yulu | 2014-05-16 16:20:00 | initialization
#
=============================================================================*/
#include <iostream>
#include <algorithm>
using namespace std;
//求双亲、左孩子、右孩子结点
int LEFT(int i)
{
return 2*i;
}
int RIGHT(int i)
{
return 2*i+1;
}
int PARENT(int i)
{
return i/2;
}
//对单个结点i进行max-heapify
void MAX_HEAPIFY(int *A,int i,int len)
{
int largest=i;
int l=LEFT(i);
int r=RIGHT(i);
if(i<=len/2)
{
if(l<=len && A[l]>A[largest])
largest=l;
if(r<=len && A[r]>A[largest])
largest=r;
if(largest!=i)
{
swap(A[largest],A[i]);
MAX_HEAPIFY(A,largest,len);
}
}
}
//对所有一个已知的数组A的所有结点进行heapify,除了叶结点
void BUILD_MAX_HEAP(int *A,int len)
{
for(int i=len/2;i>=1;i--)
{
MAX_HEAPIFY(A,i,len);
}
return;
}
void print_array(int *A,int len)
{
for(int i=1;i<=len;i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
return;
}
//堆排序:找到最大的元素,放置在数组的末端,heap_size减一,然后进行max_heapify
void heap_sort(int *A,int len)
{
int heap_size=len;
BUILD_MAX_HEAP(A,heap_size);
for(int i=len;i>=2;i--)
{
heap_size--;
int temp; //交换A[1]与A[i]
temp=A[1];
A[1]=A[i];
A[i]=temp;
MAX_HEAPIFY(A,1,heap_size);
}
return;
}
int main()
{
int A[]={0,1,2,3,4,7,8,9,10,14,16};
int len=sizeof(A)/sizeof(int)-1;
cout<<"The array size is:"<<len<<endl;
cout<<"Original heap is: "<<endl;
print_array(A,len);
BUILD_MAX_HEAP(A,len);
cout<<"After building the heap is:"<<endl;
print_array(A,len);
heap_sort(A,len);
cout<<"After heap sorting is:"<<endl;
print_array(A,len);
return 0;
}
堆排序 Heapsort
最新推荐文章于 2024-05-19 17:08:00 发布