大根堆排序

堆排序

序言

排序算法分为:

1、插入排序

2、交换排序

3、选择排序

4、归并排序

5、基数排序

一、介绍大根堆排序

本文主讲选择排序中的大根堆排序。选择排序又包含了两种排序,一个是简单选择排序,另一个则是在简单选择排序的基础上进行改进之后的算法——堆排序。而堆排序又分为大根堆和小根堆。详细可以参考下面的框架图。

选择排序:

1、简单选择排序(不常用)

2、堆排序

2.1、大根堆

2.2、小根堆

本篇博客主要讲解大根堆排序,什么是大根堆???

大根堆实际上是一颗完全二叉树,在完全二叉树的基础上,父节点的关键字要大于左右孩子节点的关键字,这样子的完全二叉树称为大根堆

实际上小根堆是父节点的关键字要小于左右孩子节点的关键字。

举个例子:

在这里插入图片描述

父节点9大于左孩子节点8,大于右孩子节点7;同样父节点8大于左孩子节点6,大于右孩子节点5….依次类推。

二、代码实现

本文使用Java代码实现大根堆排序

2.1、源代码

public class Heapsort {
    public void sort(int arr[]) {package com.bubaiwantong.sort;

public class Heapsort2 {
    public void sort(int arr[]) {
        //首次创建大根堆,需要的时间多一点,后面进行调正就少了许多时间。
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjust(arr, i, arr.length);
        }

        for (int i = arr.length - 1; i >= 0; i--) {
            swap(arr, 0, i);
            adjust(arr, 0, i);
        }
    }

    /**
     * 调整大根堆
     * @param arr
     * @param i
     * @param length
     */
    public void adjust(int arr[], int i, int length) {
        int temp = arr[i];
        for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++;
            }
            if (temp > arr[k]) {
                break;
            } else {
                arr[i] = arr[k];
                i = k;
            }
        }
        arr[i] = temp;
    }

    /**
     * 进行交换
     * @param arr
     * @param i
     * @param j
     */
    public void swap(int arr[], int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 输出排序后的每一个数据
     * @param arr
     */
    public void printArr(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    /**
     * main函数
     * @param args
     */
    public static void main(String[] args) {
        int[] arr = new int[]{9, 8, 7, 6, 5, 4, 3, 2, 1};
        Heapsort2 heapsort2 = new Heapsort2();
        heapsort2.sort(arr);
        heapsort2.printArr(arr);

    }
}
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjust(arr, i, arr.length);
        }

        for (int i = arr.length - 1; i >= 0; i--) {
            swap(arr, 0, i);
            adjust(arr, 0, i);
        }
    }

    public void adjust(int arr[], int i, int length) {
        int temp = arr[i];
        for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++;
            }
            if (temp > arr[k]) {
                break;
            } else {
                arr[i] = arr[k];
                i = k;
            }
        }
        arr[i] = temp;
    }

    public void swap(int arr[], int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public void printArr(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    public static void main(String[] args) {
        int[] arr = new int[]{9, 8, 7, 6, 5, 4, 3, 2, 1};
        Heapsort2 heapsort2 = new Heapsort2();
        heapsort2.sort(arr);
        heapsort2.printArr(arr);

    }
}

2.2、输出结果

1 2 3 4 5 6 7 8 9 
Process finished with exit code 0
 heapsort2.sort(arr);
    heapsort2.printArr(arr);

}

}




### 2.2、输出结果

```java
1 2 3 4 5 6 7 8 9 
Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JavaGPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值