亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

堆的簡單應用

發布時間:2020-07-31 04:55:37 來源:網絡 閱讀:391 作者:福大馨 欄目:編程語言

一、大數據的處理

給出N個數據,要求找到并輸出這N個數里面最大的K個數

思路:利用堆,先建一個開辟一個大小為K的數組,從N個數據里拿出K個數據放到堆里面,然后再通過向

下調整法把堆調整為最小堆,此時數組的第一個元素就是堆里面最小的元素,然后在剩下的N-K個


數據中依次和堆里面最小的數據進行比較,若比第一個元素大,則交換兩個的值,每交換一次就向下調

整一次,保證在最上面的是最小元素,這樣一直到所有數據比較完畢,此時堆里面存儲的k個數據就是最

大的k個數據。


下面是實現代碼

#include<iostream>
#include<algorithm>


using namespace std;
//1.在N個數據當中找出最大的K個數

const int N = 10000;
const int K = 100;

void AdjustDown1(int a[], int size, int parent)  //建一個小堆
{
int child = parent * 2 + 1;

while (child < K)
{
if ((child + 1 < K) && (a[child + 1] < a[child]))
{
child++;
}

if (a[child] < a[parent])
{
swap(a[child], a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}



}


void GetTopK(int a[],int TopK[])
{
assert(K < N);
int i = 0;
int j = 0;
int m = 0;
int n = 0;

for (i = 0; i < K; i++)
{
TopK[i] = a[i];     //取出a中的前k個數字放到topk[]里面
}

//建堆

for (j = (K - 2) / 2; j >0; --j)
{
AdjustDown1(TopK,K,j);
}

for (int m = 0; m < N; ++m)
{
if (a[m]>TopK[0])
{
TopK[0] = a[m];
AdjustDown1(TopK, K, 0);
}
}


for (int n = 0; n < K; ++n)  //一次輸出K個最大數
{
cout << TopK[n] << " ";
}
cout << endl;
}

測試代碼

#include"BIgData.h"



void TestTopK()
{
int a[N];
int TopK[K];

for (int i = 0; i < N; ++i)
{
a[i] = i;
}

GetTopK(a, TopK);


}
int main()
{
TestTopK();
system("pause");
return 0;
}

測試結果

堆的簡單應用

為了便于調試,我用的測試栗子比較簡單,大家可以嘗試一下更一般的栗子哦~

二.堆排序

思路:利用堆,建一個最大堆,每次選出最大的數據與數組末尾的數據進行交換,然后再進行一次向下

調整變成最大堆,始終保持最上面的為當前最大的數據,假設數組由n個數據,則下次就讓第一個數據與

數組的第n-1個數據作比較,因為第n個數據已經是最大的了,每交換一次要調整一次,這樣當比較到第

一個數據時這個堆就是一個有序的了。

實現代碼如下:

//2.堆排序:建大堆,每次找到最大的數據交換到數組末尾,將剩下的數據AdjustDown,再進行交換
void AdjustDown2(int a[],int size,size_t parent)
{
int child = parent * 2 + 1;

while (child<size)
{
if ((child + 1 < size)&&a[child] < a[child + 1])
{
++child;
}

if (a[child] > a[parent])  
{
swap(a[child], a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}

void Heap_Sort(int a[], size_t n)
{
for (int i = (n - 2) / 2; i >= 0; i--)  //注意邊界條件
{
AdjustDown2(a, n, i);
}

for (int i = 0; i < n; ++i)
{
swap(a[0], a[n - 1-i]);

AdjustDown2(a, n - 1 - i, 0);
}

for (int i = 0; i < n; ++i)
{
cout << a[i] << " ";
}
cout << endl;

}


測試代碼:

void TestHeap_Sort()
{
int a[] = { 10, 12, 9, 15, 13, 17, 16, 18, 20,14 };
Heap_Sort(a, 10);
}


int main()
{
TestHeap_Sort();
system("pause");
return 0;
}


測試結果:

堆的簡單應用


以上便是堆的兩種簡單應用啦,不足之處還請大家指出哦~








向AI問一下細節

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

AI

白水县| 镇康县| 东乡县| 南木林县| 盐山县| 团风县| 繁昌县| 日土县| 嘉峪关市| 古浪县| 海伦市| 桃园市| 郧西县| 托里县| 砀山县| 鹤庆县| 尚义县| 雅安市| 乐都县| 牡丹江市| 德格县| 化隆| 济南市| 丁青县| 大荔县| 德钦县| 广元市| 临沧市| 龙口市| 秦皇岛市| 昔阳县| 台东市| 若羌县| 兴义市| 汶上县| 淳安县| 礼泉县| 新余市| 柯坪县| 肥城市| 盐池县|