Java堆排序算法

今天看算法导论,翻了一下堆排序,重新复习了一下,用Java完整清晰的写了一遍。

public class Dsort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array=new int[] {5,3,17,10,84,19,6,22,9};
		heapsort(array);
		for (int i = 0; i < array.length; i++) {
			System.out.println(array[i]);
		}
	}
	
	public static void swap(int[] array, int a,int b) {
		int temp;
		temp=array[a];
		array[a]=array[b];
		array[b]=temp;
	}
	
	public static void max_heapify(int[] a,int mark,int heapsize) {
		int largest;
		int l=2*mark+1,r=2*mark+2;
		if (l<heapsize&&a[l]>a[mark]) {
			largest=l;
		}
		else {
			largest=mark;
		}
		if (r<heapsize&&a[r]>a[largest]) {
			largest=r;
		}
		if (largest!=mark) {
			swap(a, mark, largest);
			max_heapify(a, largest,heapsize);
		}
	}
	
	public static void build_maxheap(int[] a) {
		for (int i = a.length/2-1; i >= 0; i--) {
			max_heapify(a,i,a.length);
		}
	}
	
	public static void heapsort(int[] a) {
		build_maxheap(a);
		int heapsize=a.length;
		for (int i = a.length-1; i>0; i--) {
			swap(a,0,i);
			heapsize=heapsize-1;
			max_heapify(a, 0, heapsize);
		}
	}

}
堆排序主要分为两步:1.建立初始堆(build_maxheap)2.调整堆(heapsort)。而其中很核心的一个函数就是max_heapify这个函数,两个关键步骤都要使用它来进行数据交换。我这里的算法实现的是大顶堆,给出了一个测试的例子。

猜你喜欢

转载自blog.csdn.net/cool_jia/article/details/79516588