【資料結構】堆排序和模擬實現優先順序佇列!!
在很多的時候佇列的輸出不一定是先進先出的原則,同時也存在優先順序佇列。
> 在模擬實現的時候就可以根據這個優先順序的不同來建立這個佇列,即根據這個優先順序陣列來建立一個堆,那麼在輸出這個堆的時候就可以實現根據優先順序的不同來建立不同優先順序的佇列
程式碼:
template<class T>
class Priority
{
public:
Priority()
{}
Priority(T* arr,size_t size)
{
if(NULL == arr)
return ;
for(size_t i=0;i<size;i++)
s.push_back(arr[i]);
for(int j=(s.size()-2)>>1;j>=0;j--)
_AdjustDown(j);
}
void Pop()
{
_Pop();
}
void Push(T d)
{
s.push_back(d);
_AdjustUp(s.size()-1);
}
T& Top()
{
return s.front();
}
size_t Size()
{
return s.size();
}
bool Empty()
{
return s.empty();
}
private:
void _Pop()
{
if(s.empty())
return ;
s.pop_back();
for(int i=s.size();i>=0 ;i++)
_AdjustDown(i);
}
void _AdjustDown(int parent)
{
int child = parent*2 + 1;
int size = s.size();
while (child < size)
{
int tmp = child;
if(child+1 <size && s[child] < s[child + 1])
tmp += 1;
if(s[tmp] > s[parent])
{
swap(s[tmp] , s[parent]);
parent = tmp;
child = parent * 2 + 1;
}
else
break;
}
}
void _AdjustUp(int child)
{
int parent = (child-1)>>1;
int size = s.size();
while(child > 0)
{
if(child+1 < size && s[child] < s[child + 1])
child += 1;
if(s[child] > s[parent])
swap(s[child] , s[parent]);
else
break;
child = parent;
parent = (parent-1)>>1;
}
}
vector<T> s;
};
堆排序:
> 在建立堆的時候可以建立大小堆,那麼在這個堆的堆頂元素就是這個堆裡面的最大(最小)元素,那麼可以利用這個性質進行對陣列的排序。
- 先將陣列裡面的元素建立一個堆
- 再將堆頂的元素一個一個放入需要排序的陣列裡面
- 再將堆頂元素pop
- 當堆為empty時候這個陣列就已經排序好了
程式碼:
#include<vector>
#include<iostream>
using namespace std;
template<class T>
class less
{
public:
bool operator()(const T left,const T right)
{
return left > right;
}
};
template<class T>
class Grate
{
public:
bool operator()(const T left,const T right)
{
return left < right;
}
};
template< typename T , class Compare = less<T> >
class Heap
{
public:
Heap()
{}
Heap(T* arr,size_t size)
{
if(NULL == arr)
return ;
for(int i=0;i<size;i++)
hp.push_back(arr[i]);
for(int j = (hp.size()-2)>>1;j >= 0;j--)
_AdjustDown(j);
}
void Show()
{
int size = hp.size();
for(int i =0;i<size;i++)
cout<<hp[i]<<" ";
cout<<endl;
}
void Insert(T d)
{
_Insert(d);
}
void Pop()
{
_Pop();
}
T& Top()
{
return hp.front();
}
T& Back()
{
return hp.back();
}
void _Pop()
{
if(hp.empty())
return ;
int size = hp.size();
swap(hp[0],hp[size -1]); //swap first and last data,next pop last data
hp.pop_back(); //pop last data
if(size > 1)
_AdjustDown(0); //adjust data
}
bool Empty()
{
return hp.empty();
}
void _Insert(T d)
{
hp.push_back(d);
int size = hp.size();
for(int i=size-1;i>0;i--)
_AdjustUp(i);
}
void _AdjustDown(int parent)
{
int child = parent*2 + 1;
Compare Cmp;
int size = hp.size();
while(child < size)
{
if(child +1< size && Cmp(hp[child] , hp[child+1]))
child = child +1;
if(Cmp(hp[parent] , hp[child]))
swap(hp[child] , hp[parent]);
else
break;
parent = child;
child = parent*2+1;
}
}
void _AdjustUp(int child)
{
int parent = (child-1)>>1;
int size = hp.size();
while(child > 0)
{
if(hp[child] > hp[parent])
{
swap(hp[child], hp[parent]);
child = parent;
parent = (parent-1)>>1;
}
else
break;
}
}
vector<T> hp;
};
template<class T>
void HeapSort(T* arr,size_t size)
{
if(NULL == arr)
return ;
Heap<T> h(arr,size);
for(int i=0;i < size; i++)
{
arr[i] = h.Top();
h.Pop();
}
}
相關文章
- Redis實現任務佇列、優先順序佇列Redis佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 【資料結構】順序佇列的實現(c++)資料結構佇列C++
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- 優先順序佇列是一種什麼樣的資料結構佇列資料結構
- 優先佇列和堆排序佇列排序
- 封裝優先順序佇列封裝佇列
- [PY3]——實現一個優先順序佇列佇列
- 資料結構之PHP(最大堆)實現優先佇列資料結構PHP佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- 堆排序與優先佇列排序佇列
- Python 列表推導及優先順序佇列的實現Python佇列
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- 原始碼解析C#中PriorityQueue(優先順序佇列)的實現原始碼C#佇列
- 【資料結構】回顧優先佇列(堆)資料結構佇列
- Facebook的分散式優先順序佇列FOQS分散式佇列
- 堆、堆排序和優先佇列的那些事排序佇列
- RMQ——支援合併和優先順序的訊息佇列MQ佇列
- java資料結構基礎-利用Heap(堆)實現PriorityQueue(優先佇列)Java資料結構佇列
- MYSQL實現ORDER BY LIMIT的方法以及優先佇列(堆排序)MySqlMIT佇列排序
- 完全二叉樹實現優先佇列與堆排序二叉樹佇列排序
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- 佇列的順序儲存結構佇列
- 堆和堆的應用:堆排序和優先佇列排序佇列
- 資料結構-js實現棧和佇列資料結構JS佇列
- 資料結構與演算法分析 (優先佇列)資料結構演算法佇列
- [演算法系列之四]優先順序佇列演算法佇列
- js實現資料結構--佇列JS資料結構佇列
- 資料型別優先順序資料型別
- 使用C#實現順序佇列C#佇列
- 【資料結構】實現順序表(c++)資料結構C++
- Python3 執行緒優先順序佇列( Queue)Python執行緒佇列
- 個推基於 Apache Pulsar 的優先順序佇列方案Apache佇列
- 利用順序儲存結構實現雙端佇列的入隊和出隊操作佇列
- c++模擬實現順序表C++
- 資料結構之php實現佇列資料結構PHP佇列
- 演算法與資料結構番外(1):優先佇列演算法資料結構佇列
- 【資料結構】實現順序表(c語言)資料結構C語言