优先级队列概述

概念

优先队列是一种用来维护一组元素构成的集合S的数据结构,其中每个元素都有一个键值key,元素之间的比较都是通过key来比较。优先队列包括最大优先队列和最小优先队列。

算法分析

基于最小优先队列进行讨论,顾名思义:出队,队头元素是最小的;入队,直接在队尾插入就可以了。

时间复杂度

优先级队列依旧是队列,队列具有的属性和操作,优先级队列也都是具有的。真正影响时间复杂度的就是入队操作和出队操作。

1、使用无序数组,那么每一次插入的时候直接在数组末尾插入即可,入队时间复杂度为O(1),如果要保证队头元素是最小的,必须先进行查找,时间复杂度是O(n),然后将最小值和队头元素进行交换后,将队头元素出队,出队的时间复杂度是O(n)。

2、使用有序数组,每一次插入通过堆排序,将元素放在合适的位置(注意,入队的时候还是在队尾插入,调整是在入队完成之后),时间复杂度是log2(n)。如果想让最小值从队首出队,由于元素已经有序,队首元素本身就是最小值。注意和无序数组作比较,无序数组出队的时候并没有保证一开始队头元素就是最小的。

经过分析,利用有序数组并且采用堆排序来构建优先级队列。

 空间复杂度

不管是无序数组实现还是有序数组实现,都只需要借用一个临时空间。故空间复杂度都是O(1)。

编程:

public static void shiftUPSmall(int[] array,int index){
        while (index != 0){
            int parent = (index-1)/2;
            if(array[parent] > array[index]){
                int tmp = array[parent];
                array[parent] = array[index];
                array[index] = tmp;
                index = parent;
            }else{
                break;
            }
        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值