一、問題概述
優先級隊列的定義:
?????? 優先級隊列不同于普通的隊列,普通的隊列具有先進先出的原則,而優先級隊列是選擇優先級最高的先出隊。那么,如何模擬實現優先級隊列呢?在這里,我們將較大的值作為優先級較高的。
二、解決思路
????? (1)用插入排序的思想,將它們按由大到小(也可由小到大)排好序,再push到隊列中,那么隊列中的隊首元素便是優先級最高的,取其front,便可得到優先級最高的值。
??????? 此時,push的時間復雜度為(O(1)),pop的時間復雜度為(O(N)),Top的時間復雜度為(O(1)).
????? (2)用選擇排序的思想,選擇出值最大的那個元素,將其push到隊列中,再取次大的,push到隊列中,依次下去,將所有值push到隊列中,那么隊列中的隊首元素便是優先級最高的,取其front,便可得到優先級最高的值。
?????? 此時,push的時間復雜度為(O(N)),pop的時間復雜度為(O(1)),Top的時間復雜度為(O(N)).
那么,根據時間復雜度來看,兩種算法哪一個更好呢?
解析一下:(如果不考慮取Top(),比較插入排序和選擇排序)
插入排序:push時間復雜度為(O(1)),pop時如果無序的話,它是O(N),但是如果本身是有序的話,pop的時間復雜度就為(O(1)),它是可變的,分最好最壞;
但是選擇排序就不一樣了,它的push的復雜度永遠都為(O(N)),pop的時間復雜度為(O(1));
綜上所述,插入排序的思想實現優先級隊列更好。
下面把兩種優先級隊列都實現一下吧~~
三、實現代碼
//插入排序實現優先級隊列
#pragma once
#include<iostream>
using namespace std;
#include<queue>
#include<assert.h>template<typename T>
T QueuePriority(T *arr1,size_t size)
{assert(arr1);queue<T> q;T arr2[7] = {0};arr2[0] = arr1[0];for(size_t i = 1; i < size; ++i){if(arr2[i-1] <= arr1[i]){arr2[i] = arr1[i];}else{size_t j = 0;for(j = i-1; j >= 0; --j){if(arr2[j] > arr1[i]){arr2[j+1] = arr2[j];}else{break;}}arr2[j+1] = arr1[i];}}for(int k = size-1; k >= 0; k--){q.push(arr2[k]);}return q.front();
}void FunTest()
{int arr1[] = {1,3,5,4,2,6,0};char arr2[] = {'a','d','b','c'};size_t size = sizeof(arr1)/sizeof(arr1[0]);size_t size1 = sizeof(arr2)/sizeof(arr2[0]);cout<<QueuePriority<int>(arr1,size)<<endl;cout<<QueuePriority<char>(arr2,size1)<<endl;
}int main()
{FunTest();return 0;
}
//用選擇排序實現優先級隊列
#pragma once
#include<iostream>
using namespace std;
#include<queue>
#include<assert.h>template<typename T>
T QueuePriority(T *arr1,size_t size)
{assert(arr1);queue<T> q;for(size_t i = 0; i < size; ++i){T max = i; for(size_t j = i+1;j < size; ++j){if(arr1[max] < arr1[j]){max = j;}}swap(arr1[max],arr1[i]);q.push(arr1[i]);}return q.front();
}void FunTest()
{int arr1[] = {1,3,5,4,2,6,0};char arr2[] = {'a','d','b','c'};size_t size = sizeof(arr1)/sizeof(arr1[0]);size_t size1 = sizeof(arr2)/sizeof(arr2[0]);cout<<QueuePriority<int>(arr1,size)<<endl;cout<<QueuePriority<char>(arr2,size1)<<endl;
}int main()
{FunTest();return 0;
}