zoukankan      html  css  js  c++  java
  • 堆排序_维护最大堆

    #include<iostream>
    #define MAX 1000
    #define LEFT(i) (i<<1)//左孩子
    #define RIGHT(i) (i<<1)+1//右孩子
    #define PARENT(i) (i>>1)//父亲结点
    #define exchage(x,y,z) {z=x;x=y;y=z;}//交换x和y
    
    using namespace std;
    
    int size = 0, a[MAX];
    
    /*保证每棵子树的根节点最大*/
    void MAX_HEAPIFY(int a[], int k)//维护最大堆
    {
        int l = LEFT(k), r = RIGHT(k), largest, t;
        if (l <= size && a[l] > a[k])
            largest = l;
        else
            largest = k;
        if (r <= size && a[r] > a[largest])
            largest = r;
        if (largest != k)
        {
            exchage(a[largest], a[k], t);
            MAX_HEAPIFY(a, largest);
        }
    }
    
    /*从n/2到n/2+1+……+n均为子树的根节点*/
    void BUILD_MAX_HEAP(int a[])//建立最大堆
    {
        for (int j = PARENT(size); j > 0; j--)
            MAX_HEAPIFY(a, j);
    }
    
    void Print(int a[])
    {
        for (int j = 1; j < size; j++)
            cout << a[j] << " ";
        cout << a[size] << endl;
    }
    
    void Heap_sort(int a[]);
    
    int main()
    {
        /*
        input:8
              34 56 12 545 7 3 34 23
        */
        while (1)
        {
            cout << "input the size of a[]
    ";
            cin >> size;
            if (size + 1 >= MAX){ cout << "out size!
    Please input again!
    "; }
            else break;
        }
        
        for (int j = 1; j <= size; j++)
            cin >> a[j];
    
        Print(a);
        BUILD_MAX_HEAP(a);
        Print(a);
        Heap_sort(a);
        cout << "堆排序后:
    ";
        Print(a);
        system("pause");
        return 0;
    }
    
    /*每次都将根节点与最末尾节点交换,然后维护堆*/
    void Heap_sort(int a[])//堆排序
    {
        for (int j = size, t; j > 0; j--)
        {
            exchage(a[j], a[1], t);
            MAX_HEAPIFY(a, 1);
        }
    }
    世上无难事,只要肯登攀。
  • 相关阅读:
    charles的完整使用
    优雅重启uwsgi的配置
    mysql数据库,创建只读用户
    无线技术
    Selenium
    Hexo博客美化之蝴蝶(butterfly)主题魔改
    什么是Hexo博客
    java实现链表反转
    你不知道的Java引用
    Jquery判断数组中是否包含某个元素$.inArray()
  • 原文地址:https://www.cnblogs.com/littlehoom/p/3521463.html
Copyright © 2011-2022 走看看