我的排序

我的排序

第一個: 堆排

知識標籤: heap, sort, algorithm


該代碼實現了用大頂堆排序、向大頂堆插入元素、刪除大頂堆堆頂元素

大頂堆code

#include<iostream>

void adjustup(int A[], int k)
{// 多次向上調整以第k個元素開始的子樹,直到符合大頂堆的要求
    A[0] = A[k];
    int i = k/2;
    while(i > 0 && A[i] < A[0])
    {
        A[k] = A[i];
        k = i;
        i = k/2;
    }
    A[k] = A[0];
}

void adjustDown(int A[], int k, int len)
{// 向下調整以第k個元素開始的子樹,使其符合大頂堆的要求
    A[0] = A[k];
    for(int i = 2*k; i <= len; i *= 2)
    {
        if(i < len && A[i] < A[i+1])
            ++i;
        if(A[0] > A[i])
            break;
        else
        {
            A[k] = A[i];
            k = i;
        }
    }
    A[k] = A[0];
}

void buildMaxHeap(int A[], int len)
{
    //從第len/2個元素開始,一直到堆頂元素,向下調整堆,建立大頂堆
    for(int i = len/2; i > 0; --i)
        adjustDown(A, i, len);
}

void heapsort(int A[], int len)
{// 堆排
    // 建大頂堆
    buildMaxHeap(A, len);
    //依次把堆頂元素向數組後放,並向下調整堆,最終得到從小到大的數組
    for(int i = len; i > 1; --i)
    {
        A[1] = A[i] + A[1] - (A[i] = A[1]);
        adjustDown(A, 1, i - 1);
    }
}

int main(void)
{
    std::cout << "--------堆排--------" << std::endl;

    // A[0]不存儲數據,初始化爲0
    int A1[] = {0, 6, 2, 11, 7, 4, 8};

    // A[0]不計算在內,故減1
    int len1 = sizeof(A1) / sizeof(int) - 1;
    // 對數組中前5個數排序
    heapsort(A1, len1);
    for(int i = 1; i <= len1; ++i)
        std::cout << A1[i] << '\t';
    std::cout << '\n' << std::endl;

    std::cout << "------在堆尾插入一個元素------" << std::endl;

    int A2[] = {0, 6, 2, 11, 7, 4, 8};
    int len2 = sizeof(A2) / sizeof(int) - 1;
    buildMaxHeap(A2, len2-1);
    // 打印大頂堆
    std::cout << "插入前的大頂堆: " << std::endl;
    for(int i = 1; i < len2; ++i)
        std::cout << A2[i] << "\t";
    std::cout << std::endl;
    //插入第len2個元素
    adjustup(A2, len2);
    //打印調整好的大頂堆
    std::cout << "插入後的大頂堆" << std::endl;
    for(int i = 1; i <= len2; ++i)
        std::cout << A2[i] << '\t';
    std::cout << '\n' << std::endl;

    std::cout << "-----------刪除堆頂最大元素-----------" << std::endl;

    int A3[] = {0, 6, 2, 11, 7, 4, 8};
    int len3 = sizeof(A3) / sizeof(int) - 1;
    buildMaxHeap(A3, len3);
    std::cout << "刪除前的大頂堆: " << std::endl;
    for(int i = 1; i <= len3; ++i)
        std::cout << A3[i] << "\t";
    std::cout << std::endl;

    //把堆頂元素和最後一個元素交換,邏輯刪除
    A3[1] = A3[len3] + A3[1] - (A3[len3] = A3[1]);
    adjustDown(A3, 1, len3 - 1);
    std::cout << "刪除後的大頂堆: " << std::endl;
    for(int i = 1; i < len3; ++i)
        std::cout << A3[i] << "\t";
    std::cout << std::endl;

    return 0;
}

結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章