一个简单的关于heapsort的例子,前段时间自己离职了,有了一些空闲的时间,把书上的一些伪算法用C++改写一下.
供大家参考.
#include <iostream>
//shiftp_down algorithm
void shift_down(int numbers[], int root, int bottom)
{
int maxchild,temp;
int done = 0;
while ((root*2<=bottom) && (!done))
{
if(root*2 == bottom)
maxchild = root*2;
else if(numbers[root*2]>numbers[root*2+1])
maxchild = root*2;
else
maxchild = root*2+1;
if(numbers[root]<numbers[maxchild] )
{
temp = numbers[root];
numbers[root] = numbers[maxchild];
numbers[maxchild] =temp;
root =maxchild; //保证while循环找到最到的值
}
else
done = 1;
}
}
//shift_up algorithm
//void shift_up(int numbers[], int root, int bottom)
//{
// int maxchild,temp;
// int done = 0;
// while ((root*2<=bottom) && (!done))
// {
// if(root*2 == bottom)
// maxchild = root*2;
// else if(numbers[root*2]<numbers[root*2+1])
// maxchild = root*2;
// else
// maxchild = root*2+1;
//
// if(numbers[root]>numbers[maxchild] )
// {
// temp = numbers[root];
// numbers[root] = numbers[maxchild];
// numbers[maxchild] =temp;
// root =maxchild;
// }
// else
// done = 1;
// }
//}
void heapsort( int numbers[],int array_size )
{
int m_temp = array_size/2 ;
std::cout<<numbers[m_temp]<<std::endl;
for( int i=m_temp; i>=0; i--)
{
shift_down(numbers, i, array_size);
}
int temp;
for( int m_i= array_size-1; m_i>=0;m_i--)
{
temp = numbers[0];
numbers[0] = numbers[m_i];
numbers[m_i] = temp;
shift_down(numbers, 0, m_i-1);
}
}
//void heap_sort( int numbers[],int array_size )
//{
// int m_temp = array_size/2 ;
//
// for( int i=m_temp;i>=0;i-- )
// {
// shift_up(numbers, i, array_size);
// }
//
// int temp;
// for( int m_i= array_size-1; m_i>=0;m_i--)
// {
// temp = numbers[0];
// numbers[0] = numbers[m_i];
// numbers[m_i] = temp;
// shift_up(numbers, 0, m_i-1);
// }
//}
void main()
{
const int array_size =11;
int arr[array_size] ={15,45,21,10,8,98,35,57,14,30,84};
//for (int i = 0; i < array_size; ++i)
// arr[i] = i;
heapsort( arr,array_size);
for (int i = 0; i < array_size; ++i)
std::cout<<arr[i]<<" ";
std::cout<<std::endl;
//for (int i = 0; i < array_size; ++i)
// std::cout<<arr[i]<<" ";
//std::cout<<std::endl;
}