数据结构之排序算法Java实现(2)——选择类排序之堆排序算法

这个文章旨在存代码,看了很多网上写推排序的算法,感觉写的过于臃肿,我去努力地理解了思想,自己写的,有什么问题欢迎指正。

首先是升序排序,这个要建小顶堆,Java代码如下:

public <T extends Comparable<? super T>> void sortByAsc(T[] data) {
		heapSortByAsc(data,data.length);
		
	}

	private <T extends Comparable<? super T>> void heapSortByAsc(T[] data, int length) {
		if(length == 0)
			return;
		//建堆
		for(int i = length/2 -1 ; i >= 0;i--){
			if(data[i].compareTo(data[2 * i]) < 0 ){
				swap(data,i,2*i);
			}
			if(data[i].compareTo(data[ 2*i + 1]) < 0){
				swap(data,i,2*i+1);
			}
		}
		//将堆最后一个跟根节点交换
		swap(data,0,length -1);
		//递归
		heapSortByAsc(data,length - 1);
		
	}

  下面的是降序排序,需要建大顶堆:

public <T extends Comparable<? super T>> void sortByDesc(T[] data) {
		heapSortByDesc(data,data.length);
		
	}
	private <T extends Comparable<? super T>> void heapSortByDesc(T[] data, int length) {
		if(length == 0)
			return;
		//建堆
		for(int i = length/2 -1 ; i >= 0;i--){
			if(data[i].compareTo(data[2 * i]) > 0 ){
				swap(data,i,2*i);
			}
			if(data[i].compareTo(data[ 2*i + 1]) > 0){
				swap(data,i,2*i+1);
			}
		}
		//将堆最后一个跟根节点交换
		swap(data,0,length -1);
		//递归
		heapSortByAsc(data,length - 1);
		
	}

  最后是交换的程序,很简单;

public <T extends Comparable<? super T>> void swap(T[] data, int i, int j) {  
    	T temp = data[i];
		data[i] = data[j];
		data[j] = temp; 
    } 

  

原文地址:https://www.cnblogs.com/Gabby/p/6522834.html