堆排序
重点在于第一步构造堆结构后,使用下沉算法,每次把指针指向的索引元素和跟结点交换,再指针-1,每次都把堆结点中最大的元素取出
package Mr_math;
import java.util.Random;
public class Heapsort {
public static void exch(int []p,int i,int j) {
int k = p[i];
p[i] = p[j];
p[j] = k;
}
public static void sink(int[] p,int k,int N) {
while(k*2<=N) {
int j = k*2;
if(j<N&&p[j]<p[j+1]) j++;
if(p[j]<p[k]) break;
exch(p,j,k);
k = j;
}
}
public static void sort(int[] a) {
int N = a.length-1;
for(int k = N/2;k>=1;k--) {
sink(a,k,N);
}
System.out.println("堆构造后");
iterator(a);
System.out.println();
while(N>1) {
exch(a,1,N--);
sink(a,1,N);
}
}
public static void iterator(int []a) {
for(int i=1;i<a.length;i++) {
System.out.print(a[i]+" ");
}
}
public static void main(String [] args) {
int N = 10;
int[] a = new int[N+1];
Random out = new Random();
for (int i = 1; i < a.length; i++) {
a[i] = out.nextInt(1000);
}
Heapsort hp = new Heapsort();
hp.iterator(a);
System.out.println();
hp.sort(a);
System.out.println("堆排序后");
hp.iterator(a);
}
}
运算结果: