IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 堆排序算法 -> 正文阅读

[数据结构与算法]堆排序算法

一?基础概念????????????????

? ????????堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆

1.1? 大根堆和小根堆

??? ? ? 性质:每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆;每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。如下图????????

1.2?条件

父结点索引:(index?- 1) / 2

左孩子索引:2 *?index?+ 1

右孩子索引:2 *?i?+ 2

大根堆: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位置的数交换,如此反复执行,便能得到有序数组

2.1 构造堆

主要思路:每次新插入的数据都与其父结点进行比较,如果插入的数比父结点大,则与父结点交换,否则一直向上交换,直到小于等于父结点,或者来到了顶端。然后固定一个最大值,将剩余的数重新构造成一个大根堆,重复这样的过程。

三?代码

public class test1 {
    public static void main(String[] args) {
        int[] a = { 1,3,4,2,5};
        System.out.println("原始数据:");
        for (int num : a)
            System.out.print(num + " ");
        System.out.println();
        heapSort(a);
        System.out.println("进行堆排序:");
        for (int num : a)
            System.out.print(num + " ");
        System.out.println();


   }

    private static void heapSort(int[] a) {
        if (a == null || a.length <2) {
            return;
        }
        for (int i = 0; i < a.length; i++) {
            heapInsert(a,i); //构造大根堆
        }
        int heapsize = a.length;
//        将0位置的数 与 最后一个数进行交换 并减小heapsize
        swap(a,0 ,--heapsize);
        while (heapsize >0){
//            固定最大值
            heapify(a, 0, heapsize);
            swap(a,0 ,--heapsize);
        }
    }

    private static void heapify(int[] a, int index, int heapsize) {
        int left = index * 2 + 1; //左孩子的下标
        while (left < heapsize) { //存在孩子
//            两个孩子中最大值的下标
            int largest = left + 1 < heapsize && a[left + 1] > a[left] ?
                    left + 1 : left;
//            父亲和孩子谁大 存在largest
            largest = a[largest] > a[index] ? largest : index;
//            如果与父亲的下标就是最大值的下标 则为大根堆,退出循环;
            if (index == largest) {
                break;
            }
            swap(a,largest,index);
            index = largest;
            left = index * 2 + 1;
        }
    }

    private static void heapInsert(int[] a, int index) {
//        判断index位置的值是否大于父节点的值
        while (a[index] > a[(index - 1)/ 2]){
            swap(a,index, (index - 1)/2);
            index = (index - 1)/ 2;
        }
    }

    private static void swap(int[] a, int i, int j) {
        int p = a[i];
        a[i] = a[j];
        a[j] = p;
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:27:46  更:2021-08-30 12:30:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:32:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码