[數據結構]用插入排序和選擇排序的思想實現優先級隊列

一、問題概述

優先級隊列的定義:

?????? 優先級隊列不同于普通的隊列,普通的隊列具有先進先出的原則,而優先級隊列是選擇優先級最高的先出隊。那么,如何模擬實現優先級隊列呢?在這里,我們將較大的值作為優先級較高的。


二、解決思路

????? (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;
}



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

node.js https 模塊設置請求頭等信息

// https://www.iqiyi.com/v_19rs789v28.html var fs require(fs); var https require(https); var option{rejectUnauthorized: false,hostname:www.iqiyi.com,path:/,headers:{Accept:*/*,Accept-Encoding:utf-8, //這里設置返回的編碼方式 設置其他的會是亂碼Accept-Lang…

centos升級之vim vim8.0安裝

YCM安裝攻略&#xff1a;https://blog.csdn.net/csdn_kou/article/details/81213935 卸載舊的vim yum remove vim* -y 一、源碼編譯安裝vim8.0 配置epel源 yum install epel-release 安裝python3,以及vim8.0編譯環境 yum install -y gcc python34 python34-devel ncurses…

[數據結構]求解迷宮最短路徑問題

一、問題概述 之前&#xff0c;我們了解了如何實現迷宮問題&#xff08;對于迷宮只有一個出口可以通的情況&#xff09;&#xff0c;事實上我們的迷宮有多個出口&#xff0c;對于每條路徑來說&#xff0c;有長有短&#xff0c;所以在這里&#xff0c;我們討論一下迷宮的最短路…

centos升級之內核kernel

yum update kernel yum update && yum upgrade # rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm # yum –disablerepo”*” –enablerepo”elrepo-kernel” list ava…

[STL]List的實現

STL&#xff08;Standard template Library&#xff09;:c的標準模板庫 STL是算法和數據結構的軟件框架&#xff0c;它包含了六大組件&#xff1a;算法、迭代器、容器、仿函數、配接器、空間配置器。 迭代器&#xff1a;我們可以把迭代器相當于智能指針&#xff0c;&#xff0…

python 獲取windows上 網絡連接信息 ip dhcp dns gateway

import socket import os import re def get_host_ip():"""查詢本機ip地址:return:"""try:s socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect((8.8.8.8,80))# 能提取出本機ip 通過本機ip提取出其他設置ip s.getsockname()[0]# ip地…

vc++6.0的應用程序打不開腫么辦

今天早起&#xff0c;有同學問到我關于vc6.0的安裝過程中遇到的問題&#xff0c;我聽了之后想想還是寫篇博客給大家看一下吧。因為我之前也遇到過類似的問題。當時也是挺著急的。 大家遇到的問題估計就是這樣吧~~&#xff08;下載后打不開&#xff09; 請看-->解決步驟&…

【數據結構】廣義表

一、問題概述 廣義表是非線性的數據結構&#xff0c;是由若干個元素組合而成的&#xff0c;廣義表中可以有子表&#xff0c;類似這樣的&#xff1a; 我們以C(a,b,(c,d))為例&#xff0c;將它定義為這樣的數據結構&#xff1a; 我們會給定字符串的形式&#xff0c;如&#xff…

centos升級之共享文件夾

vmware-hgfsclient vmhgfs-fuse .host:/share /mnt/hgfs 如果不行的話 cd /mnt mkdir hgfs 把上面的在執行一次

批處理創建程序的快捷方式

"D:\AppServ\timer\win_cron_zq\定時.exe" 這是應用程序timer.lnk" 這是快捷方式的名稱 echo ThePath "D:\AppServ\timer\win_cron_zq\定時.exe">aaa.vbs echo lnkname "timer.lnk">>aaa.vbs echo WS "Wscript.Shell&quo…

【數據結構】普通二叉樹的實現

一、問題概述 樹是n個有限個數據的集合&#xff0c;形如&#xff1a; 它像不像倒著的樹呢&#xff1f;我們把它看成是一種數據結構----樹。它的第一個節點稱作樹的根&#xff0c;最底下的那些節點稱作樹的葉子。 我們今天所要研究的是二叉樹&#xff0c;即父節點最多只有兩個孩…

windows 下 安裝mysql 出現 “ ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password

這個問題是在Windows下安裝MySQL服務時遇到的&#xff0c;使用MySQl綠色版進行安裝的&#xff0c;安裝完成后&#xff0c;連接到MySQL服務時輸入命令 “ mysql -uroot -p ” &#xff0c;因為時第一次登錄&#xff0c;未設置密碼&#xff0c;直接回車&#xff0c;就遇到了這個問…

setitimer用法說明

函數原型&#xff1a; int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value) 函數作用&#xff1a; 可用來實現延時和定時的功能 頭文件&#xff1a; #include <sys/time.h> 參數詳解 用一把&#xff1a;一個例子 #include &…

哈希表(閉散列、拉鏈法--哈希桶)

哈希表&#xff0c;也稱散列表&#xff0c;是一種通過key值來直接訪問在內存中的存儲的數據結構。它通過一個關鍵值的函數&#xff08;被稱為散列函數&#xff09;將所需的數據映射到表中的位置來訪問數據。 關于哈希表&#xff0c;主要為以下幾個方面&#xff1a; 一、哈希表…

僵尸進程的產生和SIGCHLD信號

核心句子 子進程在終止時會給父進程發SIGCHLD信號,該信號的默認處理動作是忽略,父進程可以自 定義SIGCHLD信號的處理函數。 僵尸進程的產生&#xff1a; #include "head.h" #include <unistd.h> #include <signal.h>int main() {key_t key ftok(&quo…

windows 通過批處理 修改環境變量

echo off setlocal enabledelayedexpansion set remain%path% ::待查找字符串 set toAddD:\ffmpeg2\ffmpeg-4.1.3-win64-shared\bin ::標記,默認沒有重復 set findedfalse :loop for /f "tokens1* delims;" %%a in ("%remain%") do (::如果找到相同的了if…

海量數據處理--位圖(BitMap)

對于海量數據這個詞&#xff0c;大家不難理解吧。主要是針對給定的數據量特別大&#xff0c;占用內存特別大的情況。那么和位圖有什么關系呢。看下面一個騰訊的海量數據的例子吧。 例&#xff1a;給40億個不重復的無符號整數&#xff0c;沒排過序。給一個無符號整數&#xff0…

ps命令與top命令參數意義詳解

文章目錄1.ps -l2.ps aux3.top面試經常被問道&#xff0c;特別是top。1.ps -l 參數解釋F代表這個程序旗標 (process flags)&#xff0c;說明這個程序的總結權限&#xff0c;常見號碼有&#xff1a;o 若為 4 表示此程序的權限為 root &#xff1b;o 若為 1 則表示此子程序僅進行…