標籤:堆排序 和 堆的大資料應用
//本次練習的是 堆排序 和 堆的大資料應用
//堆排序的時間複雜度為 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;
}650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/7E/D8/wKiom1cKHXyj8EqyAAA0CYgicTU561.png" title="2016-04-10 17:31:27螢幕.png" alt="wKiom1cKHXyj8EqyAAA0CYgicTU561.png" />
本文出自 “水仙花” 部落格,請務必保留此出處http://10704527.blog.51cto.com/10694527/1762368
堆排序 和 堆的大資料應用