前言:
堆性质定义
大根堆:arr(i)>arr(2*i+1) && arr(i)>arr(2*i+2)
小根堆:arr(i)<arr(2*i+1) && arr(i)<arr(2*i+2)
堆排序基本思想:
1.首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端
2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1
3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组
(一)代码
private static void sort(int[] array) { int len = array.length; //构建大根堆 buildMaxHeap(array,len); for(int i = len - 1 ; i > 0 ; i--){ //因为上面已经构建好了大根堆 //0 的位置就是最大的值,将最大值与最后一位交换, //再将剩余的数,重新构建大根堆 swap(array,0,i); len--; //剩余的数重新构建大根堆 heapify(array,0,len); } } private static void buildMaxHeap(int[] array,int len) { //注意此处i >= 0 for(int i = (int)Math.floor(len / 2); i >= 0 ;i--){ heapify(array,i,len); } } private static void heapify(int[] array, int i, int len) { //左 int left = 2 * i + 1; //右 int right = 2 * i + 2; //根 int root = i; //如果左边的节点 大于 根节点 就把左边的下标 赋给根 if(left < len && array[left] > array[root]){ root = left; } //如果右边的节点 大于 根节点 就把右边的下标 赋给根 if(right < len && array[right] > array[root]){ root = right; } //交换根节点 与 左子 或 右子 if(root != i){ //交换 swap(array,i,root); //递归执行 heapify(array,root,len); } } public static void swap(int[] array,int i , int j){ int temp = array[i]; array[i] = array[j]; array[j] = temp; }
每天没干什么,就感觉好累