• 堆——数据结构


    堆(最大堆)的操作,以下函数用A[0]来存放元素的个数:

    void swap(int A[], int i, int j);  //交换两个元素

    1.void sift_up(int A[], int i);   //把堆中第i个元素上移

    2.void sift_down(int A[], int i);  //把堆中的第i个元素下移

    3.void heap_insert(int A[], int x);  //把元素x插入堆中

    4.void heap_delete(int A[], int i);    //删去堆中第i个元素

    5.int delete_max(int A[]);      //删除堆中的最大元素

    6.void make_heap(int A[], int n);  //使数组A中的元素按堆的结构重新组织

    7.void heap_sort(int A[], int n);  //将数组A进行堆排序

    1.元素上移操作:

    沿着A[i]到根的一条线,把元素A[i]向上移动,移动过程中,把它和其父亲结点进行比较,如果大于其父亲结点,就交换两个元素。如此进行,直到找到它所到达的一个合适的位置为止。

    void sift_up(int A[], int i){
        while(i != 1){
            if(A[i] > A[i/2]) swap(A, i, i/2);
            else break;
    
            i /= 2;
        }
    }

    2.元素下移操作:

    将A[i]向下移动,移动过程中,将关键字于其两个儿子中较大的一个比较,如果小于,就交换,继续进行,否则,便是找到了合适位置,终止。

    void sift_down(int A[], int i){
        while((i*=2) <= A[0]){
            if(i+1<=A[0] && A[i+1]>A[i]) i++; //要找最大的,最大堆嘛
    
            if(A[i/2] < A[i]) swap(A, i/2, i);
            else break;
        }
    }

    3.元素插入操作:

    把堆的大小增1,把x放到堆的末端,然后进行上移操作。

    void heap_insert(int A[], int x){
        A[0]++;
        A[A[0]] = x;
        sift_up(A, A[0]);
    }

    4.元素删除操作:

    先用最后一个元素取代A[i],然后根据被删除元素和取代元素的大小,决定是上移还是下移操作。

    void heap_delete(int A[], int i){
        int x = A[i], y = A[A[0]];
        A[0]--;
        if(i<=A[0]){
            A[i] = y;
            if(x < y) sift_up(A, i);
            else sift_down(A, i);
        }
    }

    5.删除最大元素

    int delete_max(int A[]){
        int x = A[1];
        heap_delete(A, 1);
        return x;
    }

    6.堆的建立

    数组是从0号元素开始存放元素,而堆是从数组的第1号元素开始存放数据。先将数组0号元素放到第n号中。因为叶子具有堆的性质,无须调整,所以可以从最后一个叶片的父亲开始调整,进行下移操作。

    void make_heap(int A[], int n){
        int i;
        A[n] = A[0];
        A[0] = n;
        for(i=n/2; i>=1; i--) sift_down(A, i);
    }

    7.堆排序:

    void heap_sort(int A[], int n){
        int i;
        make_heap(A, n);
        for(i=n; i>=1; i--){
            swap(A, 1, A[0]);
            A[0]--;
            sift_down(A, 1);
        }
        A[0] = n;
    }
  • 相关阅读:
    中国马的跳法
    桃子到底有多少
    Precision power (高精度幂运算)(相乘的变体)
    判断两条线段是否相交
    大菲波数
    小数保留格式
    Java 注意事项
    KMP复习整理
    printf函数精讲
    再解 KMP(初学)
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2939450.html
Copyright © 2020-2023  润新知