91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

堆排序   和 堆的大數據應用

發布時間:2020-07-25 17:37:17 來源:網絡 閱讀:308 作者:ye小灰灰 欄目:大數據

//本次練習的是   堆排序   和  堆的大數據應用
//堆排序的時間復雜度為   O(n)
//堆的大數據應用應選擇   小堆   進行處理
//但  當數據超過100000時速度明顯變慢,可能是建立小堆的時候慢   》》》》》有沒有更優的方法



#include<iostream>
#include<vector>
#include<time.h>
using namespace std;


//........................以下為  堆排序.....................................
void AdjustDownGreater(vector<int>& h,size_t size)//建立大堆
{
    if (size <= 1)        //注意參數檢測啊....
    {
        return;
    }
    for (int parent = (size - 1 - 1) / 2; parent >= 0; parent--)    //經驗:可以先寫內層循環,再寫外層循環
    {
        while(parent <= size - 1)
        {
            int leftcChild = 2 * parent + 1;

            if (leftcChild + 1 <= size - 1 && h[leftcChild] < h[leftcChild + 1])
            {
                leftcChild++;
            }

            if (leftcChild <= size - 1 && h[parent] < h[leftcChild])
            {
                swap(h[parent], h[leftcChild]);
                parent = leftcChild;
            }
            else
            {
                break;
            }
        }
    }
}

void HeapSort(vector<int>& h,size_t size)
{
    while (size > 1)
    {
        swap(h[0], h[size - 1]);
        size--;

        AdjustDownGreater(h,size);
    }

}

void Print(vector<int>& h,size_t size)
{
    for (int i = 0; i < size; i++)
    {
        cout << h[i]<<"  ";
    }
}

void Test1()
{
    int arr[] = { 10, 16, 18, 12, 11, 13, 15, 17, 14, 19 };

    vector<int> h;
    for (int i = 0; i < 10; i++)
    {
        h.push_back(arr[i]);
    }

    AdjustDownGreater(h, 10);
    HeapSort(h, 10);
    Print(h, 10);
}


//..................................以下為堆大數據應用....................


//從n個數據中選出前k個最大的數        用的是  *******《小堆》**********************
//選擇小堆的原因:用一個數組來存儲k個數arr[k]   如果選出的第一個數就是最大的那個,那后面的就進不了arr了


const int N = 100000;       //當超過100000時速度明顯變慢       《《《《有沒有更優的方法》》》
const int K = 10;

void  GetData(vector<int>& h)
{
    srand(time(0));
    for (int i = 0; i < N; i++)
    {
        h.push_back(rand() % N + 1);
    }
}

void AdjustDownLess(vector<int>& h, size_t size)//建立小堆
{
    if (size <= 1)      
    {
        return;
    }
    for (int parent = (size - 1 - 1) / 2; parent >= 0; parent--)    
    {
        while (parent <= size - 1)
        {
            int leftcChild = 2 * parent + 1;

            if (leftcChild + 1 <= size - 1 && h[leftcChild] > h[leftcChild + 1])
            {
                leftcChild++;
            }

            if (leftcChild <= size - 1 && h[parent] > h[leftcChild])
            {
                swap(h[parent], h[leftcChild]);
                parent = leftcChild;
            }
            else
            {
                break;
            }
        }
    }
}

void GetGreatestK(vector<int>& h, vector<int>& greatest)
{
    AdjustDownLess(h, N);

    for (int i = 0; i < K; i++)   //把前K個較小的push進去
    {
        greatest.push_back(h[i]);
    }

    for (int index = K; index < N; index++)
    {
        AdjustDownLess(greatest, K);        //為了得到最小的數

        if (h[index] > greatest[0])        //換掉最小的數
        {
            greatest[0] = h[index];
        }
    }
}

void Print(vector<int>& h)
{
    for (int i = 0; i < K; i++)
    {
        cout << h[i]<<"  ";
    }
}

void Test2()
{
    vector<int> h;
    vector<int> greatest;
    GetData(h);
    GetGreatestK(h, greatest);
    Print(greatest);
}


int main()
{
    //Test1();
    Test2();

    return 0;
} 堆排序   和  堆的大數據應用


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贡山| 汉川市| 张家港市| 朔州市| 扶沟县| 扶绥县| 平顶山市| 罗山县| 神池县| 浮山县| 墨脱县| 兴城市| 太保市| 华宁县| 江陵县| 佛学| 五河县| 青河县| 丰县| 南宁市| 延长县| 阿尔山市| 武隆县| 永年县| 北宁市| 巢湖市| 平顶山市| 凌云县| 涪陵区| 桃园市| 拜城县| 柳州市| 双城市| 鹤岗市| 哈密市| 丁青县| 开江县| 柳江县| 辽宁省| 巴中市| 定兴县|