思想:
(1)令i=l,并令temp= kl ;
(2)计算i的左孩子j=2i+1;
(3)若j<=n-1,则转(4),否则转(6);
(4)比较kj和kj+1,若kj+1>kj,则令j=j+1,否则j不变;
(5)比较temp和kj,若kj>temp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)
(6)令ki等于temp,结束。
Java
public class HeapSort {
public static void main(String[] args) {
int[] array = new int[]{2, 3, 5, 8, 9, 0, 7, 5, 1, 6, 8, 7};
sort(array);
System.out.println(Arrays.toString(array));
}
public static void sort(int[] a){
int N = a.length;
int[] keys = new int[N+1];
//注意,堆的数据结构是从1开始的,0不用
for (int i = 1; i < keys.length; i++) {
keys[i] = a[i-1];
}
// //构造堆,使得堆是有序的
for(int k = N/2;k>=1;k--) sink(keys,k,N);
//排序,相当于毁掉堆
while(N>1){
exch(keys,1,N--);
sink(keys,1,N);
}
//重新写回数组
for (int i = 0; i < a.length; i++) {
a[i] = keys[i+1];
}
}
private static void sink(int[] a, int k, int N) {
// TODO Auto-generated method stub
while(2*k<=N){
int j = 2*k;
if (j < N && less(a[j], a[j+1])) j++;
if (less(a[j], a[k])) break;
exch(a, k, j);
k = j;
}
}
private static boolean less(int k, int j) {
// TODO Auto-generated method stub
return k < j;
}
private static void exch(int[] a, int i, int n) {
// TODO Auto-generated method stub
int temp = a[i];
a[i] = a[n];
a[n] = temp;
}
}
C
void HeapSort(SeqIAst R) {
//对R[1..n]进行堆排序,不妨用R[0]做暂存单元
int I;
BuildHeap(R);
//将R[1-n]建成初始堆
for(i=n;i>1;i--)
//对当前无序区R[1..i]进行堆排序,共做n-1趟。
{
R[0]=R[1];
R[1]=R[i];
R[i]=R[0]; //将堆顶和堆中最后一个记录交换
Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆质
}
}
最优时间:O(nlgn)
最差时间:O(nlgn)
网友评论