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 |