之前研究一些排序算法,在网上找了一些文章,但是运行结果不是很理想,所以就自己写了一个,暂时没有发现什么bug。
public class HeapSort {
public static void heapSort(int[] a){
double len = a.length - 1;
//从最后一个非叶子节点开始调整堆
for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
heapAdjust(a, i, a.length - 1);
}
//将堆顶元素与最后一个元素交换,并剔除末尾元素将剩余元素调整为大顶堆
for (int i = a.length - 1; i >= 1; i--) {
swap(a, 0, i);
heapAdjust(a, 0, i - 1);
}
}
/*
* 调整堆的方法
* */
public static void heapAdjust(int[] a, int root, int length){
//使j指向左孩子节点
for (int j = 2*root+1; j <= length; j = 2*root+1) {
//在左右孩子节点中选择值较大的一个
if (j+1 <= length && a[j] < a[j + 1]) {
j++;
}
//比较父节点与所选孩子节点大小
if (a[root] >= a[j]) {
break;
}
//若孩子节点的值比父节点大,交换之
swap(a,root,j);
//继续调整交换后的孩子节点,直到成为大顶堆
root = j;
}
}
/*
* 交换两个数的位置
* */
public static void swap(int[] a, int i, int j){
a[i] = a[i]^a[j];
a[j] = a[i]^a[j];
a[i] = a[i]^a[j];
}
public static void main(String[] args) {
int[] a = {5, 4, 8, 87, 34, 65, 13, 54, 35, 12};
heapSort(a);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}