排序算法堆排序 (算法导论学习)
Posted 作死的跑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法堆排序 (算法导论学习)相关的知识,希望对你有一定的参考价值。
堆排序算法
1.将排序数组用二叉树堆进行表示
设置数组
a = [16|14|10|8|7|9|3|2|4|1]
展现出一个最大堆
[16]
[14] [10]
[8] [7] [9] [3]
[2] [4] [1]
private int parent(i){
return i/2;
}
private int left(i){
return 2i;
}
private int right(i){
return 2i+1;
}
2.维护堆的属性(最大堆、最小堆)
维护堆 如果子节点比父节点大则进行交互,保证父节点大于子节点
private void maxHeapify(int[] a,int i,int heapSize){
int left = left(i);
int right = right(i);
int largest;
if (left <= heapSize && a[left] > a[i]){
largest = l;
} else {
largest = i;
}
if (right <= heapSize && a[right] > a[largest]){
largest = r;
}
if (largest != i) {
int t = a[i];
a[i] = a[largest];
a[largest] = t;
maxHeapify(a,largest);
}
}
3.建堆
可以用自底向上的方法利用方法
maxHeapify()
把大小为n=a.lenght
的数组a[1..n]
转换为最大堆子数组
a[n/2+1...n]
中的元素都为叶子节点建堆过程如下private void buildMaxHeap(int[] a,int heapSize){
for (int i = a.lenght/2;i >= 0;i--){
maxHeapify(a,i,heapSize);
}
}
4.堆排序
堆中的
a[1]
的元素总是堆中的最大值通过它与a[n]
进行互换我们就可以让改元素放正确位置每次从跟节点往下搜索将最大元素替换到跟节点上
private void heapSort(int[] a){
int heapSize = a.lenght - 1
buildMaxHeap(a,heapSize);
for (int i = a.lenght - 1;i >= 1;i++){
exhange a[1] with a[i];
heapSize = a.heapSize -1;
maxHeapify(a,0,heapSize)
}
}
以上是关于排序算法堆排序 (算法导论学习)的主要内容,如果未能解决你的问题,请参考以下文章