栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

韩顺平 数据结构与算法 (12

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

韩顺平 数据结构与算法 (12

树结构应用部分 1)堆排序 1.基础介绍
  1. 堆排序是利用堆这种数据结构而设置的一种排序算法,堆排序是一种选择排序,他的最坏最好平均时间复杂度均为O(nlogn),他也是不稳定排序
  2. 堆是具有一下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。
    **注意:**没有要求节点的左孩子的值和右孩子的的大小关系
  3. 每个结点的值都小于或等于左右孩子节点的值,称为小顶堆
  4. 图示-大顶堆

  1. 图示小顶堆

2.基本思想(大顶堆)
  1. 将待排序的序列构造成一个大顶堆;
  2. 此时,整个序列的最大值就是堆顶(root)
  3. 将其与末尾元素进行交换,此时末尾就为最大值
  4. 然后将n-1个元素重新构造成一个堆,这样就会得到n个元素的次小值,如此反复,便能得到一个有序序列。

可以看到,再构建大顶堆的过程中,元素的个数逐渐减少,最后就得到一个有序序列了。

3.代码实现——(有点难,时间复杂度测试很快(80万_2s))
package DataStructures.Tree;

import java.util.Arrays;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HeapSort {
    public static void main(String[] args) {

//        //要求:将数组进行升序排序
//        int arr[] = {4, 6, 8, 5, 9};
//        heapSort(arr);
        int arr[] = new int[8000000];
        for (int i = 0; i < 8000000; i++) {
            arr[i] = (int) (Math.random() * 8000000);//生成一个[0,8000000)
        }

        Date data1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss:SSSS");
        String date1Str = simpleDateFormat.format(data1);
        System.out.println("排序前的时间是" + date1Str);
        //---排序---
        heapSort(arr);
        //---排序完毕---
        Date data2 = new Date();
        String date2Str = simpleDateFormat.format(data2);
        System.out.println("排序后的时间是" + date2Str);

    }

    //堆排序方法
    public static void heapSort(int arr[]) {
        int temp = 0;
        System.out.println("堆排序");
        
        //最终代码
        //先将最大值放在最顶端
        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));
    }

    
    public static void adjustHeap(int arr[], int i, int lenght) {
        //先取出当前元素的值
        int temp = arr[i];
        //调整位置
        for (int k = i * 2 + 1; k < lenght; k = k * 2 + 1) {
            if (k + 1 < lenght && arr[k] < arr[k + 1]) {
                //说明左子节点的值小于右子节点的值
                k++;//k就指向右子节点
            }
            if (arr[k] > temp) {
                //如果子节点大于父节点
                arr[i] = arr[k];
                i = k;//!!!i指向k,继续循环比较
            } else {
                break;
            }
        }
        //当for循环结束后,我们已经将以i为父节点的子树的最大值放在了最顶上【局部】
        arr[i] = temp; //将temp值放到调整后的位置
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346146.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号