堆排序是選擇類排序演算法,核心思想依然是選擇最大(小)的元素,與直接選擇排序不同的是,堆排序借助了最大堆的特性,使得最大元素的查詢更加的便利。
最大堆
最大堆是二叉堆的乙個形式,最大堆要求根節點的關鍵字是所有節點關鍵字中的最大者,即要求最大堆根節點的關鍵字不小於其左葉子的關鍵字,也不能小於右葉子的關鍵字。這就要求最大堆:
最大堆的子樹也是乙個最大堆;
最大堆是完全二叉樹,而且是根節點關鍵字大於等於左右葉子關鍵字的完全二叉樹
既然最大堆是完全二叉樹,則根節點與其葉子節點節點之間的存在以下關係:
子節點a[i]的父節點a[parent(i)]=a[(i-1)/2]
父節點i的左葉子節點a[left(i)]=a[2*i+1]
父節點i的右葉子節點a[left(i)]=a[2*i+2]
演算法描述
通過待排序的無序佇列自下而上構建最大堆;
交換最大堆首尾兩個元素,則最大元素被交換到隊尾,並移除
已排序的最大元素
由於佇列頂端新元素的加入破壞了原有的最大堆狀態,重新調整為最大堆;
重複2)3)步驟,知道排序完成。
演算法實現
1.調整當前堆為最大堆
/**
* 將堆調整當前的堆為最大堆
* */
private static void ajustheap(int arr, int parent, int heap_size)
int right = parent * 2 + 2;
if (right < heap_size && arr[max_index] < arr[right])
// 保證當前節點為最大堆
if (max_index != parent)
}
2.構建最大堆
/**
* 構建最大堆
*/private static void buildmaxheap(int arr)
}
3.堆排序
public static void sort(int arr)
}
排序演算法 堆排
堆排序 如果將堆結構中的資料看作是一顆完全二叉樹的各個節點,那麼堆的性質就是滿足如下性質的完全二叉樹 樹中任意非葉子節點的關鍵碼均不大於或不小於其左右孩子節點的關鍵碼。利用堆的有序性及其運算,可以容易的實現選擇排序的方法稱為堆排序。假設欲對含有n個物件的序列v 0 v 1 v n 1 進行堆排序,演...
Algorithm 排序演算法
閒來無事回顧一下原來所學的排序演算法,包括冒泡 選擇 插入 希爾 快速 歸併排序,這六種。首先依次講解原理,最後放出實現及測試速度原始碼。我想大部分人學習的第乙個排序演算法就是這個。顧名思義,如泡泡般,越到水面就越大,即經過連續不斷的判斷,選取大 或小 的值進行交換,一輪結束後,未排序資料最後面的就...
演算法algorithm 冒泡(bubble)排序
待排序的陣列元素依次兩兩比較,如果前面的大於後面的,則進行交換 public static void main string args sort arr system.out.println arrays.tostring arr private static void sort int arr p...