[数据结构]用插入排序和选择排序的思想实现优先级队列

一、问题概述

优先级队列的定义:

       优先级队列不同于普通的队列,普通的队列具有先进先出的原则,而优先级队列是选择优先级最高的先出队。那么,如何模拟实现优先级队列呢?在这里,我们将较大的值作为优先级较高的。


二、解决思路

      (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.mzph.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 则表示此子程序仅进行…