数据结构之排序算法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; }