堆排序

来源:互联网 发布:淘宝网软件免费下载 编辑:程序博客网 时间:2024/06/03 15:27

利用二叉树的特性实现堆排序

#include<iostream>using namespace std;//节点从0开始所以会多1int left(int i){    return i * 2 + 1;}int right(int i){    return i * 2 + 2;}//使得节点i及其子节点都是最大堆void Max_Heapfiy(int *A, int length, int i){    int Right = right(i), Left = left(i), largest = i;    if (Left < length && A[Left] > A[largest])    {        largest = Left;    }    if (Right < length && A[Right] > A[largest])    {        largest = Right;    }    if (largest != i)    {        int temp = A[i];        A[i] = A[largest];        A[largest] = temp;        Max_Heapfiy(A, length, largest);    }}void Build_Max_Heap(int *A, int length){    //从最后一个非叶子节点开始,到根节点,因为Max_Heapfiy调用时必须保证子节点是最大堆    for (int i = (length - 1) / 2; i >= 0; i--)    {        Max_Heapfiy(A, 5, i);    }}void px(int *A, int length){    Build_Max_Heap(A, length);    for (int i = length - 1; i >= 1; i--)    {        int temp = A[i];        A[i] = A[0];        A[0] = temp;        Max_Heapfiy(A, i, 0);    }}int main(){    int a[5] = {5,3,2,1,4};    px(a, 5);    system("pause");    return 0;}

在对堆进行删除时,将对应节点值,变为最小值,然后调用Max_Heapfiy函数从新排序即可,插入则想加入一个最小值,保证原堆是最大堆,然后逐层比较节点和父节点大小,判断是否交换

0 0
原创粉丝点击