您的位置:首页 > 其它

堆排序算法

2015-08-07 15:55 281 查看
小根堆:所有子节点都大于其父节点。

大根堆:所有子节点都小于其父节点。

int heapSize = 0;

//返回左子节点索引
int Left(int index){return ((index << 1) + 1);}

//返回右子节点索引
int Right(int index){return ((index << 1)+ 2;)}

//交换a,b的值
void swap(int *a, int *b){int temp = *a; *a = *b; *b = temp;}

//array[index]与其左、右子树进行递归对比
//用最大值替换array[index],index表示堆顶索引
void maxHeapify(int array[], int index)
{
int largest = 0;
int left = Left(index);      //左子节点索引
int right = Right(index); //右子节点索引

//把largest赋为堆顶与其左子节点的较大值
if((left <= heapSize) && (array[left] > array[index]))
largest = left;
else
largest = index;
//把largest与堆顶的右子节点比较,取较大值
if((right <= heapSize) && (array[right] > array[largest]))
largest = right;
//此时largest为堆顶、左子节点、右子节点中的最大值
if(largest != index)
{
//如果堆顶不是最大值,则交换,并递归调整堆
swap(&array[index],&array[largest]);
maxHeapify(array, largest);
}
}

//初始化堆,将数组中的每一个元素置放到适当的位置
//完成之后,堆顶的元素为数组的最大值
void buildMaxHeap(int array[], int length)
{
int i;
heapSize =length;  //堆大小赋为数组长度
for( i = (length >> 1); i >=0; i--)
{
maxHeapify(array, i);
}
}

void heap_sort(int array[], int length)
{
int i;
//初始化堆
buildMaxHeap(array, (length - 1));
for(i = (length - 1); i >= 1; i--)
{
//堆顶元素array[0](数组的最大值)被置换到数组的尾部array[i]
swap(&array[0],&array[i]);
heapSize--;                   //从堆中移除该元素
maxHeapify(array, 0);   //重建堆
 }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: