日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/11/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [数据结构]用插入排序和选择排序的思想实现优先级队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、問題概述

優先級隊列的定義:

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


二、解決思路

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


總結

以上是生活随笔為你收集整理的[数据结构]用插入排序和选择排序的思想实现优先级队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。