数据结构与算法-01(算法走起)

来源:互联网 发布:我的淘宝没有我要开店 编辑:程序博客网 时间:2024/05/29 17:02
/** * 堆排序 * @author lk * 思想 * 【1】:根据初始数组去构造初始堆(构建一个完全二叉树,保证所有父节点都比它的孩子节点数值大) * 【2】:每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩余元素重新调整为大根堆 * */public class HeapSort {/** *  * 交换方法 * @param array * @param index * @param old */public static void exchange(int[] array,int index,int old){array[index]=array[index]+array[old];array[old]=array[index]-array[old];array[index]=array[index]-array[old];}/** * 初始化堆 * @param array */public static void initHeap1(int[] array){for(int i=array.length/2;i>=1;i--){heapAdjust1(array,i,array.length);//数组,2,父节点3,节点个数}for(int i=array.length-1;i>0;i--){System.out.println("--"+Arrays.toString(array));exchange(array, 0, i);heapAdjust1(array, 1, i);}}/** * 堆调整 * @param array * @param i * @param length */private static void heapAdjust1(int[] array, int i, int length) {//首先判断是否有左孩子int temp = array[i-1];//临时数据if(2*i>length)//无左孩子return;//得到左孩子int lchild = 2*i;//判断是否有右孩子if(lchild<length&&array[lchild-1]<array[lchild]){//如果有右孩子//判断左右孩子的大小lchild++;//换为右孩子}if(temp<array[lchild-1]){//如果父节点小于孩子节点array[i-1]=array[lchild-1];//将孩子节点的值赋值给父节点array[lchild-1]=temp;//交换后,是否符合数的概念heapAdjust1(array,lchild,length);}}@Testpublic void testHeapInit(){int[] array = new int[]{1, 3, 4, 5, 2, 6, 9, 7, 8, 0,12,15,9};initHeap1(array);System.out.println(Arrays.toString(array));}}

阅读全文
1 0
原创粉丝点击