概念
优先队列是一种用来维护一组元素构成的集合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;
}
}
}