堆排序算法API
public class Heapsort |
|
public static void sort(Comparable[] a) 堆的构造、下沉排序,销毁堆 private static void sink(Comparable[] a,int i,int N) 下沉排序 private static void exch(Comparable[] a,int i,int j) 交换 private static boolean less(Comparable v,Comparable w) 比较 private static void show(Comparable[] a) public static void main(String[] args) |
package _2_Sorting;
import java.util.Scanner;
/** 算法2.7 堆排序
* 唯一能够同时最优地利用空间和时间的方法
* 堆的构造:从右到左用sink()函数构造子堆
* 下沉排序:将堆的最大元素删除,然后放入堆缩小后数组中空出的位置
*/
public class Heapsort
{
public static void sort(Comparable[] a)
{ /*堆的构造*/
int N=a.length-1; /*a.length=N+1*/
for(int k=N/2;k>=1;k--)
sink(a,k,N);
while(N>1)
{ /*下沉排序,销毁堆*/
exch(a,1,N--);
sink(a,1,N);
}
}
private static void sink(Comparable[] a,int i,int N)
{
while(2*i<=N)
{
int j=2*i;
if(j<N&&less(a[j],a[j+1])) /*找出较大的子节点*/
j++;
if(!less(a[i],a[j])) break; /*是否下沉*/
exch(a,i,j);
i=j;
}
}
private static void exch(Comparable[] a,int i,int j)
{
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
private static boolean less(Comparable v,Comparable w)
{
return v.compareTo(w)<0;
}
private static void show(Comparable[] a)
{
for(int i=1;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int N;
N=sc.nextInt();
String[] a=new String[N+1]; /*a.length=N+1*/
sc.nextLine(); /*读走换行*/
System.out.println("请输入"+N+"个字符串:");
for(int i=1;i<=N;i++) /*从a[1]开始存*/
a[i]=sc.nextLine();
sort(a);
show(a);
}
}