堆排序前序之佇列優先順序
應用場景:
對於現在的計算機來說,同時可以執行多個程式,加上作業系統裡面一大堆的程序,作業系統經常會處理各個程序的排序,從而有條不紊執行各種程式。
在這種情況下,需要一種資料結構且需要以下的功能:刪除最大元素和插入元素,這種型別叫做優先佇列。
提供的方法:
常用的排序演算法之中的exch()交換方法,less()比較方法,此外還提供了插入方法insert()和刪除最大的方法delMax(),以及由此生成的上浮方法swim()和下沉的方法sink()。
原理:
概念成形圖:

從圖中可以明顯的看出:若將一個數組的所有資料按照圖示的順序排放在一個堆種,且int型資料之中,可以發現每個節點(除開根節點)的的父節點均是當前節點的1/2,即4/2 = 2,5/2=2,得到的總是它的父節點;
這樣就為我門提供了思路:想要一個這樣的堆是有序的話,將其中的節點和它的上下節點做對比,如果它比子節點小就和子節點交換位置,如果比父節點大就和父節點交換位置,這兩種交換就像泡泡上浮,下沉的樣子;所以將其取名為swin和sink;最終也會得到最上面的(陣列的第一個)數是最大的;刪除的時候,將根節點儲存,並和陣列的最後一個節點交換,然後返回最大值,將陣列的長度減一,最後釋放最後一個節點。
實現程式碼:
public class YouxiangDuilie{ /* *通過陣列實現佇列的優先順序 * * * */ //初始化陣列和定義N表示陣列的長度 private int [] keys; private int N; /* *交換函式 * */ public void exch(int [] a,int i,int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } /* *判斷大小函式 * */ public boolean less(int a,int b){ return a[a].compareTo(a[b]) < 0; } /* *上浮函式: *如果這個數比它的上一級的數大的話,就將它兩交換。 * */ public void swim(int k){ while(k > 1&& less(k / 2,k)){ exch(k / 2,k); k = k / 2; } } /* *將元素下沉 * */ public void sink(int k){ while(K * 2 <= N){ int j = k * 2; //此時下標為2*n,需要判斷和它同級的數字誰小,取一個小的進行對比 if(j < N && !less(j,j+1)) j++;//如果是奇數大就將索引放到奇數為 if(!less(k , j)) break; exch(k,j); k = j; } } /* *實現陣列的新增 * */ public void insert(int n ){ key[++N] = n ; //處於最底層所以要將其上浮 swim(N); } /* *刪除元素的操作並返回 * */ public int delMax(){ int maxax = a[1]; //將最後一個和第一個交換位置;並將陣列的長度減一 exch(1,N--); a[N] = null; return max; } }