堆排序(Java) 发表于 2020-08-16 | 分类于 算法 | 本文总阅读量 字数统计: 564 | 阅读时长 ≈ 2 堆排序(Java)上代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586import java.text.SimpleDateFormat;import java.util.Date;public class HeapSort { public static void main(String[] args) { //升序排列 //int[] arr = {4,6,8,5,9}; //创建80000个随机数 int[] arr = new int[8000000]; for (int i = 0; i <8000000; i++) { arr[i] = (int) (Math.random()*8000000);//生成一个[0,8000000)的数 } //System.out.println("排序前:"); //System.out.println(Arrays.toString(arr)); Date date1 = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); String date1Str = simpleDateFormat.format(date1); System.out.println("排序前的时间是:"+date1Str); long startMili=System.currentTimeMillis();// 当前时间对应的毫秒数 heapSort(arr); long endMili=System.currentTimeMillis(); //System.out.println("排序后:"); //System.out.println(Arrays.toString(arr)); Date date2 = new Date(); String date2Str = simpleDateFormat.format(date2); System.out.println("排序后的时间是:"+date2Str); double h = (endMili-startMili)/1000.0; System.out.println("总耗时为:"+(endMili-startMili)+"毫秒"+"="+ h + "秒"); } public static void heapSort(int[] arr){ int temp = 0; System.out.println("堆排序!"); 分步完成 adjustHeap(arr, 1, arr.length); System.out.println("NO.1:"+ Arrays.toString(arr)); adjustHeap(arr, 0 , arr.length); System.out.println("NO.2:" + Arrays.toString(arr)); //一次完成 for (int i = arr.length / 2 - 1; i >= 0 ; i--) { adjustHeap(arr, i, arr.length); } for (int j = arr.length - 1; j > 0 ; j--) { //交换 temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; adjustHeap(arr, 0, j); } //System.out.println("数组=" + Arrays.toString(arr)); } /** * 功能:完成将以i对应的非叶子节点的树调整为大顶堆 * 举例:{4,6,8,5,9} => i=1 =>adjustHeap => {4,9,8,5,6} * @param arr 待调整数组 * @param i 非叶子节点在数组中的索引 * @param length 对多少个元素继续调整,length在减少 */ public static void adjustHeap(int[] arr,int i,int length){ int temp = arr[i]; //取出当前元素,保存在临时变量 //开始调整 for (int k = i*2+1; k <length ; k=k*2+1) { if(k+1 < length && arr[k] <a rr[k+1] ){ //左子节点小于右子节点 k++; //k指向右子节点 } if(arr[k] > temp){ //如果子节点大于结点 arr[i] = arr[k]; //把较大的值赋值给当前结点 i = k; } else{ break; } } //当for循环结束,我们已经将以i为父结点的树的最大值放在最顶 arr[i] = temp;//将temp放到最后调整的位置 }} Donate comment here 打赏 微信支付 支付宝