Java实现堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序是一种选择排序,他的最好、最坏,平均时间复杂度均为O(nlogn),它也是不稳定的排序。
堆是具有以下性质的完全二叉树:
(1)每个结点的值都大于或等于其左右子结点的值,称为大顶堆 (2)每个结点的值都小于或等于其左右子结点的值,称为小顶堆 (3)升序使用大顶堆,降序使用小顶堆
堆排序的思路:
(1)将需要排序的序列构成一个大(小)顶堆 (2)整个序列的最大、最小值就是堆顶的根结点 (3)将其与末尾元素交换,此时末尾就位最大值 (4)将剩余n-1个元素重新构造成一个堆,这样将会得到n个元素的次大(小)值。 (5)重复步骤,就可以得到有序序列了
堆排序图解:
实现代码:
package com
.struct
;
import java
.security
.PublicKey
;
import java
.util
.Arrays
;
public class HeadSort {
public static void main(String
[] args
) {
int[] arr
= {4,6,8,5,9};
headSort(arr
);
}
public static void headSort(int[] arr
)
{
int temp
;
for (int i
= arr
.length
/ 2 - 1; i
>= 0; i
--) {
adjustHead(arr
,i
,arr
.length
);
}
for (int j
= arr
.length
-1; j
> 0 ; j
--) {
temp
= arr
[j
];
arr
[j
] = arr
[0];
arr
[0] = temp
;
adjustHead(arr
,0,j
);
}
System
.out
.println(Arrays
.toString(arr
));
}
public static void adjustHead(int[] arr
,int i
,int length
)
{
int temp
= arr
[i
];
for (int k
=2*i
+1; k
< length
; k
++) {
if (arr
[k
] < arr
[k
+1] && (k
+1) < length
)
k
++;
if (arr
[k
] > temp
)
{
arr
[i
] = arr
[k
];
i
= k
;
}
else {
break;
}
arr
[i
] = temp
;
}
}
}