Java--算法--堆排序
- 堆排序的基本介绍:
-
堆排序的代码实现:
-
-
-
-
-
-
-
package com.model.tree; import java.util.Arrays; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/7/14 16:34 * 树的实际应用:堆排序 */ public class TreeDemo04 { public static void main(String[] args) { int[] array={4,6,8,5,9,-1,555,67}; // heapOrder(array); heapSearch(array); System.out.println(Arrays.toString(array)); } /* public static void heapOrder(int[] array){ int temp=0; for (int i = array.length/2-1; i >=0; i--) { adjustHeap(array, i , array.length); } // adjustHeap(array, 0, array.length); for (int j = array.length-1; j >0 ; j--) { temp=array[j]; array[j]=array[0]; array[0]=temp; adjustHeap(array, 0, j); } System.out.println(Arrays.toString(array)); }*/ /** * @param array :要调整的数组 // * @param i :要调整的根节点 * @param length :要调整的数组的长度 * @Return void */ /* public static void adjustHeap(int[] array,int i,int length){ // 将数调整为大顶堆的树,此节点的下子节点中最大的值放在此节点上 int temp=array[i]; //j=2*i+1:左子树的下标,2*j+1:子节点的子节点 for (int j = 2*i+1; j < length; j=2*j+1) { // 比较一下左子树的值大还是右子树的值大 if (j+1<length&&array[j]<array[j+1]){ j++;//让指针指向右子树 } if (temp<array[j]){ array[i]=array[j]; i=j; }else { break; } } array[i]=temp; } */ // 调整为大顶堆的树 public static void buildTree(int[] array,int length){ // 对所有的非叶子节点从下到上,从左到右进行,检查,其是否时最大的值 for (int i = length/2-1; i >=0; i--) { int j=i*2+1; //左节点 if (j+1<length&&array[j]<array[j+1]){//左节点的值小于右节点的值 j++; } if (array[j]>array[i]){//非叶子节点和子节点中较大的值进行交换 int temp=array[i]; array[i]=array[j]; array[j]=temp; } } } public static void heapSearch(int[] array){ for (int i = array.length-1; i >=0; i--) { buildTree(array, i+1); int temp=array[i]; array[i]=array[0]; array[0]=temp; } } }
-