之前的博客介绍介绍了数组的两种排序算法:插入排序和归并排序(采用递归),见链接http://blog.csdn.net/u013165521/article/details/46845033。
本篇博客,介绍另一种排序算法:堆排序。(内容参照算法导论)
所谓堆,它是一个数组,也可以被看成一个近似的完全二叉树。树上每个结点对应数组的一个元素。二叉堆分为二种:最大堆和最小堆。本文主要介绍最大堆,最小堆类似。最大堆的特点:对于任意某个结点,该结点的值大于左孩子、右孩子的值,但是左右孩子的值没有要求。
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void Swap(int *x, int *y);
void Max_heapify(int array[], int i, int heap_size);
void Build_max_heap(int array[],int len);
void Heapsort(int array[],int len);
void Swap(int *x, int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
void Max_heapify(int array[], int i, int heap_size)
{
int largest;
int _left=2*i;
int _right=2*i+1;
if (_left<=heap_size && array[_left]>array[i])
{
largest=_left;
}
else
largest=i;
if (_right<=heap_size && array[_right]>array[largest])
{
largest=_right;
}
if (largest!=i)
{
Swap(&array[largest],&array[i]);
Max_heapify(array,largest,heap_size);
}
}
void Build_max_heap(int array[],int len)
{
int heap_size=len;
for (int i=len/2; i>=1; i--)
{
Max_heapify(array,i,heap_size);
}
}
void Heapsort(int array[],int len)
{
int heap_size=len;
Build_max_heap(array,len);
for (int i=len; i>=2; i--)
{
Swap(&array[1],&array[i]);
heap_size--;
Max_heapify(array,1,heap_size);
}
}
void main()
{
int array[]={0,14,10,8,7,9,3,2,4,1};
int len=9;
Heapsort(array,len);
cout<<"heap sort result:\n";
for (int i=1; i<=len; i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/u013165521/article/details/47189031