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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

用堆实现优先级队列

發布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用堆实现优先级队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 用堆實現優先級隊列

1 用堆實現優先級隊列


如果最小鍵值元素擁有最高的優先級,那么這種優先隊列叫作升序優先隊列(即總是先刪除最小的元素),類似的,如果最大鍵值元素擁有最高的優先級,那么這種優先隊列叫作降序優先隊列(即總是先刪除最大的元素);由于這兩種類型是完全對稱的,所以只需要關注其中一種,如升序優先隊列。

算法實現:

#include <stdio.h> #include <stdlib.h> #include <string.h>#define DEFAULT_CAPCITY 128typedef int DataType;#define isLess(a,b) (a<b)typedef struct _PriorityQueue {DataType* arr; //存儲堆元素的數組int size; //當前已存儲的元素個數int capacity; //當前存儲的容量 }PriorityQueue;bool init(PriorityQueue& pq, int* orginal, int size); bool push(PriorityQueue& pq, DataType value); bool pop(PriorityQueue& pq, DataType& value); bool isEmpty(PriorityQueue& pq); bool isFull(PriorityQueue& pq); void destroy(PriorityQueue& pq); static void build(PriorityQueue& pq); static void adjustDown(PriorityQueue& pq, int index); static void adjustUp(PriorityQueue& pq, int index);/*初始化優先隊列*/ bool init(PriorityQueue& pq, DataType* orginal, int size) {int capacity = DEFAULT_CAPCITY > size ? DEFAULT_CAPCITY : size;pq.arr = new DataType[capacity];if (!pq.arr) return false;pq.capacity = capacity;pq.size = 0;//如果存在原始數據則構建最大堆if (size > 0) {//方式一: 直接調整所有元素memcpy(pq.arr, orginal, size * sizeof(int));pq.size = size;//建堆build(pq);}return true; }/*銷毀優先級隊列*/ void destroy(PriorityQueue& pq) {if (pq.arr) delete[] pq.arr; }/*優先隊列是否為空*/ bool isEmpty(PriorityQueue& pq) {if (pq.size < 1) return true;return false; }/*優先隊列是否為滿*/ bool isFull(PriorityQueue& pq) {if (pq.size < pq.capacity) return false;return true; }int size(PriorityQueue& pq) {return pq.size; }/* 從最后一個父節點(size/2-1 的位置)逐個往前調整所有父節點(直到根節 點), 確保每一個父節點都是一個最大堆,最后整體上形成一個最大堆 */ void build(PriorityQueue& pq) {int i;for (i = pq.size / 2 - 1; i >= 0; i--) {adjustDown(pq, i);} }/*將當前的節點和子節點調整成最大堆*/ void adjustDown(PriorityQueue& pq, int index) {DataType cur = pq.arr[index];//當前待調整的節點int parent, child;/*判斷否存在大于當前節點子節點,如果不存在 ,則堆本身是平衡的,不需要調整;如果存在,則將最大的子節點與之交換,交換后,如果這個子節點還有子節點,則要繼續 8979438401111按照同樣的步驟對這個子節點進行調整*/for (parent = index; (parent * 2 + 1) < pq.size; parent = child) {child = parent * 2 + 1;//取兩個子節點中的最大的節點if (((child + 1) < pq.size) && isLess(pq.arr[child], pq.arr[child+ 1])) {child++;}//判斷最大的節點是否大于當前的父節點if (isLess(pq.arr[child], cur)) {//不大于,則不需要調整,跳出循環break;}else {//大于當前的父節點,進行交換,然后從子節點位置繼續向下調整 pq.arr[parent] = pq.arr[child];pq.arr[child] = cur;}} }/*將當前的節點和父節點調整成最大堆*/ void adjustUp(PriorityQueue& pq, int index) {if (index < 0 || index >= pq.size) {//大于堆的最大值直接 returnreturn;}while (index > 0) {DataType temp = pq.arr[index];int parent = (index - 1) / 2;if (parent >= 0) {//如果索引沒有出界就執行想要的操作if (isLess(pq.arr[parent], temp)) {pq.arr[index] = pq.arr[parent];pq.arr[parent] = temp;index = parent;}else {//如果已經比父親小 直接結束循環break;}}else {//越界結束循環break;}} }/* 刪除優先隊列中最大的節點,并獲得節點的值*/ bool pop(PriorityQueue& pq, DataType& value) {if (isEmpty(pq)) return false;value = pq.arr[0];pq.arr[0] = pq.arr[--pq.size];//heap.arr[0] = heap.arr[heap.size-1];//heap.size--;adjustDown(pq, 0);// 向下執行堆調整return true; }/*優先隊列中插入節點*/ bool push(PriorityQueue& pq, DataType value) {if (isFull(pq)) {fprintf(stderr, "優先隊列空間耗盡!\n");return false;}int index = pq.size;pq.arr[pq.size++] = value;adjustUp(pq, index);return true; }int main(void) {PriorityQueue pq;int task[] = { 1, 2, 3, 87, 93, 82, 92, 86, 95 };int i = 0;if (!init(pq, task, sizeof(task) / sizeof(task[0]))) {fprintf(stderr, "初始化優先隊列失敗!\n");exit(-1);}for (i = 0; i < pq.size; i++) {printf("the %dth task:%d\n", i, pq.arr[i]);}//堆中插入優先級為 88 的任務push(pq, 88);//堆中元素出列printf("按照優先級出列:\n");DataType value;while (pop(pq, value)) {printf(" %d\n", value);}destroy(pq);system("pause");return 0; }

參考資料:

  • C/C++從入門到精通-高級程序員之路【奇牛學院】
  • 總結

    以上是生活随笔為你收集整理的用堆实现优先级队列的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 一个色在线视频 | 1级性生活片 | 五月天婷婷色综合 | 天天草夜夜操 | av片在线免费观看 | 欧美国产一级 | 香蕉国产精品视频 | 99久久99九九99九九九 | 国产资源在线免费观看 | 免费成人蒂法网站 | 亚一区二区 | 日本黄a三级三级三级 | 久久免费网 | 亚洲精品综合在线观看 | 欧美天堂视频 | 日本三级吃奶头添泬 | 中文在线资源天堂 | 99资源在线 | 女色婷婷| 嫩草视频在线观看免费 | 日本亚洲欧美 | 国产精品男女 | 欧美精品一区二区三区久久久竹菊 | 4色av| 国产偷拍一区二区 | 国产欧美日韩视频在线观看 | 大尺度做爰呻吟舌吻网站 | 亚洲裸体网站 | 一道本久在线中文字幕 | 日本变态折磨凌虐bdsm在线 | 五月天丁香 | 国产调教视频 | 国语对白对话在线观看 | 日韩精品在线视频免费观看 | 色网站视频 | 国产a线| 欧美视频四区 | 国产日韩免费 | 国产xxx视频 | 国产经典毛片 | 日韩精品国产一区 | 亚洲成人av免费在线观看 | 日本三级吹潮 | 日本a级在线 | 不卡av一区| 欧美色图五月天 | 日本不卡高清视频 | 国精品一区二区三区 | 超污视频在线观看 | 手机在线免费看av | 男女偷爱性视频刺激 | 国产超碰人人 | 国产日韩激情 | 少妇高潮惨叫久久久久 | 黄色大网站| 精品成人一区二区三区 | 久久无码高潮喷水 | 亚洲免费成人在线 | 久久精品黄色片 | av不卡在线免费观看 | 苍井空浴缸大战猛男120分钟 | www.毛片com | 黄色视屏软件 | 18女人毛片 | 亚洲欧美日韩国产一区二区 | 鲁啊鲁在线视频 | 日韩一级免费观看 | 国产女人爽到高潮a毛片 | 亚洲天堂男人av | 97av在线 | 用力使劲高潮了888av | 朝桐光av在线一区二区三区 | 国产精品视频在 | 超碰在线免费 | 一本视频 | 法国性xxxx精品hd | 天天宗合 | 91黄色小网站 | 日韩色一区| 国产亚洲一区二区在线 | 中文字幕一区二区三区不卡 | 色综合激情 | 国产盗摄一区二区三区 | 青青草视频在线免费观看 | 91精品免费看 | 91精品免费看 | 靠逼网站在线观看 | 8050午夜一级毛片久久亚洲欧 | 香蕉a| sm捆绑调教视频 | 实拍女处破www免费看 | 91精品国产乱码久久 | 蜜桃久久久aaaa成人网一区 | 1000部国产精品成人观看 | 欧美视频在线观看 | 国产在线视频二区 | 精品一二三区久久aaa片 | 美国色综合 | 亚洲国产精一区二区三区性色 |