算法2.7堆排序(algs)

本文介绍了一种高效的空间和时间利用算法——堆排序。通过详细解释堆的构造过程和下沉排序方法,展示了如何实现堆排序算法。同时提供了完整的Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


                                                   堆排序算法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);
	}
}

                                                                              




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值