堆排序
重点在于第一步构造堆结构后,使用下沉算法,每次把指针指向的索引元素和跟结点交换,再指针-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) ;
}
}
运算结果: