简介
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
java代码实现
注:具体实现可以参考 ———>http://algs4.cs.princeton.edu
这是只是我的代码
package com.gcp.www;
public class HeapSort {
public int[] heapSort(int[] A, int n) {
// write code here
int N = A.length;
//构建堆有序
for(int k = n/2 ; k >=1; k-- ){
sink(A,k,N); //从二叉堆的一半进行由右边向左边的扫描,构造堆有序(大根堆)
}
//进行堆的一个修复工作(保证堆有序后进行堆的修复工作从而进行排序)
//将大根堆的顶点和最后一个节点进行交换并且将堆的大小减去1;
while(N > 1 ){
exch(A,1,N);
N--;
//修复堆(已经是堆有序了,直接用下沉法即可修复堆)
sink(A,1,N);
}
return A;
}
private void sink(int[] a,int k,int n){ //下沉
while(2*k <= n){
int j = 2*k;
if( j < n && less(a,j,j+1)){ //说明最后一个含有右枝并且右枝大于左枝
j++;
}
if(less(a,k,j)){ //比较k 和 j 所在位置数的大小
//交 换
exch(a,k,j);
}else //
break;
k = j;
}
}
private void exch(int[] a,int i,int j){
int temp = a[i-1];
a[i-1] = a[j-1];
a[j-1] = temp;
}
private boolean less(int[] a,int i,int j){
return a[i-1] < a[j - 1] ?true:false;
}
public static void main(String[] args) {
int[] A = {54,35,48,36,27,12,44,44,8,14,26,17,28,-1,-3};
A = new HeapSort().heapSort(A, A.length);
for (int i : A) {
System.out.println(i);
}
}
}