堆排序
2018-03-05 01:49
225 查看
一直对这种排序没有仔细了解,今天学习了一下
1.排序规则若是升序,则先构建大顶堆,反之构建小顶堆
2.该例使用升序排序
给定一个整形数组a[]={20,50,10,30,70,20,80}
首先构造大顶堆
注意这里,元素20和元素80交换后,20所在的节点还有子节点,所以还要再和它的子节点5 6的元素进行比较,因此代码中adjustHeap函数递归调用,以防止交换后原节点不满足规则
至此有序堆已经构造好了!如下图
然后对堆进行调整
1.堆顶和堆尾进行交换
2.堆长度减1
3.从堆顶开始自上往下调整
由于函数递归执行,所以只需执行一次即可
依次类推,最终
思路很简单,唯一难点如何在于代码中递归的实现调整
1.排序规则若是升序,则先构建大顶堆,反之构建小顶堆
2.该例使用升序排序
给定一个整形数组a[]={20,50,10,30,70,20,80}
首先构造大顶堆
注意这里,元素20和元素80交换后,20所在的节点还有子节点,所以还要再和它的子节点5 6的元素进行比较,因此代码中adjustHeap函数递归调用,以防止交换后原节点不满足规则
至此有序堆已经构造好了!如下图
然后对堆进行调整
1.堆顶和堆尾进行交换
2.堆长度减1
3.从堆顶开始自上往下调整
由于函数递归执行,所以只需执行一次即可
依次类推,最终
思路很简单,唯一难点如何在于代码中递归的实现调整
public class Sort { public static void main(String[] args) { int[] arr = new int[]{2,3,2,1,23232,12321,2122}; heapSort(arr); System.out.println(Arrays.toString(arr)); } static public void heapSort(int[] arr){ int length = arr.length; //创建大顶堆 int beginIndex = length / 2 - 1; for(int i = beginIndex; i >= 0; i --) { adjustHeap(arr,i,length); } //调整 int n = length - 1; for (int i = 0; i < length - 1; i++) { swap(arr,0,n); n--; adjustHeap(arr,0,n + 1); } } static public void adjustHeap(int[] arr,int i,int length){ int left = 2 * i + 1; int right = 2 * i + 2; if (left >= length) return; //是叶子节点 int maxindex; if(left < length && right < length) { if(arr[left] > arr[right]) maxindex = left; else maxindex = right; } else maxindex = left; if (arr[i] < arr[maxindex]) { swap(arr, i, maxindex); //递归操作,避免交换后出现错误 adjustHeap(arr,maxindex,length); } } static public void swap(int[] arr, int index1, int index2) { arr[index1] = arr[index1] ^ arr[index2]; arr[index2] = arr[index2] ^ arr[index1]; arr[index1] = arr[index1] ^ arr[index2]; }