public PrioritizedObject(T element, int priority) { this.element = element;//元素 this.priority = priority;//优先级 arrivalOrder = nextOrder;//放入队列的顺序 nextOrder++; }
public int compareTo(PrioritizedObject obj) { int result; if (priority > obj.getPriority()) result = 1; else if (priority < obj.getPriority()) result = -1; else if (arrivalOrder > obj.getArrivalOrder()) result = 1; else result = -1; return result; }
链表实现和数组实现的removeMin操做的复杂度同为o(logn)html
public HeapNode lastNode;
在二叉树的数组实现中,树的根位于位置0处,对于每一结点n,n的左孩子将位于数组的2n+1位置处,n的右孩子将位于数组的2(n+1)位置处java
heapSort方法的两部分构成:添加列表的每一个元素,而后一次删除一个元素git
就堆排序来讲,老师在上课的时候讲的很详细,并且由于它是有最小堆和最大堆的,根部要不是最小元素,要不是最大元素,所以,堆排序的关键就是经过不断的移动,将最值放在根处,而后利用remove根处元素的方法,将元素删除出来,再对剩余的堆进行重排序,而后继续删除根部,而这个过程,每删除的元素排列出来就是咱们所须要的升序或者降序,即堆排序完成算法
堆排序咱们也能够用数组的知识进行理解。由于咱们在数组实现堆时,已经知道了对于一个根结点,其左右孩子的肯定所在位置,因此咱们能够利用比较和互换,进行排序,其实原理和上一条是相同的。api
不管是用列表仍是数组进行堆排序,他们的复杂度相同,都是o(nlogn)
数组
对于列表进行堆排序来讲:在前面的学习中,咱们知道,不管是addElement仍是removeMin它们的复杂度都是o(logn)。可是咱们要注意的是,这个复杂度是在添加或者删除一个元素的状况下的复杂度。而咱们进行排序的时候,是须要添加且删除n个元素的,所以,咱们分别要进行这两个操做n次,以知足对n个元素进行排序。因此最终复杂度为2nlogn,即o(nlogn)数据结构
对于数组进行堆排序来讲:从数组中第一个非叶子的结点开始,将它与其孩子进行比较和互换(若有必要)。而后在数组中日后操做,直到根。对每一个非叶子的结点,最多要求进行两次比较操做,因此复杂度为o(n)。可是要使用这种方式从堆中删除每一个元素并维持堆的属性时,其复杂度仍为o(nlogn)。所以,即便这种方式的效率稍好些,约等于2*n+logn,但其复杂度仍为o(nlogn)。学习
问题1解决方案:
队列就是先进先出的一种形式,而优先级实际上就是根据某种标准进行排序,高级的就先排,对于相同级别的就根据先进先出的队列的要求进行排序,优先级队列也叫优先权队列。
对于优先级队列的特色:
1.优先级队列是0个或多个元素的集合,每一个元素都有一个优先权或值。
2.当给每一个元素分配一个数字来标记其优先级时,可设较小的数字具备较高的优先级,这样更方便地在一个集合中访问优先级最高的元素,并对其进行查找和删除操做。
3.对优先级队列,执行的操做主要有:(1)查找,(2)插入,(3)删除。
4.在最小优先级队列中,查找操做用来搜索优先权最小的元素,删除操做用来删除该元素。
5.在最大优先级队列中,查找操做用来搜索优先权最大的元素,删除操做用来删除该元素。
注:咱们在删除以后,要根据要求对以后的元素进行从新的排列,这个时候,咱们可能出现多种的相同优先权,因此,这个时候就应该根据队列的要素,进行先进先出的进行排序,所以这也提醒咱们,咱们在写代码时,咱们要对进入队列的顺序进行记录。
6.插入操做均只是简单地把一个新的元素加入到队列中。测试
private HeapNode<T> getNextParentAdd() { HeapNode<T> result = lastNode; while ((result != root) && (result.getParent().getLeft() != result)) result = result.getParent(); if (result != root) if (result.getParent().getRight() == null) result = result.getParent(); else { result = (HeapNode<T>) result.getParent().getRight(); while (result.getLeft() != null) result = (HeapNode<T>) result.getLeft(); } else while (result.getLeft() != null) result = (HeapNode<T>) result.getLeft(); return result; }
问题1:在进行ArrayHeap的测试时,出现这样的状况,它删除以后,后面老是多出来一个数字,不知道为何?
this
tree[count - 1] = null;
而后我把它加上就正常了
后来他给我讲缘由:
T minElement = tree[0];//最小的元素是根结点,也就是数组的0位置处 tree[0] = tree[count-1];//这个时候,将最末叶子结点放在了根结点处,准备进行重排序 tree[count-1] = null ;//将放在上面的那个最末叶子结点去掉,不然就会多出来 heapifyRemove();//进行重排序
这个是马虎的,我后来看IDEA知道了compareTo返回的是boolean型
选择排序算法经过反复地将某一特定值放在它的列表中的最终已排序位置从而完成对某一列表值的排序
插入排序算法经过反复地将某一特定值插入到该列表某个已排序的子集中来完成对列表值的排序
第十二章老师讲的比较简略,主要讲了堆排序的内容,说是颇有用的,并且我也听懂了,哈哈哈!
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 6/6 | |
第二周 | 985/985 | 1/1 | 18/24 | |
第三周 | 663/1648 | 1/1 | 16/40 | |
第四周 | 1742 /3390 | 2/2 | 44/84 | |
第五周 | 933/4323 | 1/1 | 23/107 | |
第六周 | 1110/5433 | 2/2 | 44/151 | |
第七周 | 1536/6969 | 1/1 | 56/207 | |
第八周 | 1403/8372 | 2/2 | 60/267 |