排序算法 - 堆排序

news/2024/5/19 7:13:34 标签: java, 算法, 堆排序, 数据结构

堆排序的步骤:

  1. 构造堆
  2. 固定最大值再构造堆
java">public class ArrayUtils {
	
	    public static void printArray(int[] array) {
		    System.out.print("{");
		    for (int i = 0; i < array.length; i++) {
			    System.out.print(array[i]);
			    if (i < array.length - 1) {
				    System.out.print(", ");
			    }
		    }
		    System.out.println("}");
	    }
 
	    public static void exchangeElements(int[] array, int index1, int index2) {
		    int temp = array[index1];
		    array[index1] = array[index2];
		    array[index2] = temp;
	    }
    }
java">public class HeapSort{
    public static void main(String[] args){
        int[] array = {9,8,7,6,5,4,3,2,1,0,-1};

        System.out.println("Before heap:");
        ArrayUtils.printArray(array);

        heapSort(array);

        System.out.println("After heap sort:");
        ArrayUtils.printArray(array);
    }

    public static void heapSort(int[] array){
        if(array==null || array.length <=1)
            return;

        buildMaxHeap(array);

        for(int i=array.length-1;i>=1;i--){
            ArrayUtils.exchangeElements(array,0,i);

            maxHeap(array,i,0);
        }
    }

    // 建堆的过程很简单,从下标 array.length 开始,
    // 对每个结点都执行 maxHeap() 就行了,但是叶子结点由于没有子结点,
    // 所以只需要从(array.length)/2开始
    private static void buildMaxHeap(int[] array){
        if(array==null || array.length <= 1){
            return;
        }

        int half =array.length/2;
        for(int i=half; i>=0;i--){
            maxHeap(array,array.length,i);
        }
    }

    private static void maxHeap(int[] array, int heapSize,int index){
        int left=index*2+1; // 数组是从 index 0 开始的
        int right =index*2+2;

        int largest =index;
        if(left<heapSize && array[left]>array[index]){
            largest =left;
        }

        if(right <heapSize && array[right] > array[largest]){
            largest = right;
        }

        if(index != largest){
            ArrayUtils.exchangeElements(array,index,largest);
            maxHeap(array.heapSize,largest);
        }
    }
}

参考博客:

  1. 堆排序(Heapsort)之Java实现:https://blog.csdn.net/kimylrong/article/details/17150475?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  2. 堆排序Heap Sort——浅显易懂+Java实现:https://blog.csdn.net/sunnylinner/article/details/52585225
  3. 堆排序算法(图解详细流程):https://blog.csdn.net/u010452388/article/details/81283998

http://www.niftyadmin.cn/n/794158.html

相关文章

想做一个显示全国火车运行图的网站(3) 位置的计算

地图人那里有类似的应用&#xff1a;http://www.dituren.cn/huoche/ 看起来好像是使用了51ditu的API接口&#xff0c;当初想做一个运行图的应用时&#xff0c;到网上想找找有没有现成的应用&#xff0c;找到这个算是功能最接近的了&#xff0c;但还不是我理想中的。 当然最理想…

vsCode Markdown 导出 PDF 无法显示 Latex 公式

今天用 VSCode Markdown 写笔记导出 PDF 后发现编译时正常格式的公式导出后却无法显示出来&#xff0c;这是什么原因呢&#xff0c;上网浏览了一圈&#xff0c;找到了解决方法。 解决办法 1. 找到如下位置的 template.html 文件 Mac: /Users/username/.vscode/extensions/y…

大道至简 23种模式一点就通

一、创建型模式 FACTORY&#xff1f;人才市场&#xff1a;以往是要哪个人才&#xff0c;就找哪个人才&#xff0c;效率低&#xff0c;现在有了人才市场&#xff0c;我们只需直接去人才市场挑一个好了&#xff1b; BUILDER&#xff1f;生产流水线&#xff1a;以前是手工业作坊…

从今开始,让网站用Email地址登录

现今&#xff0c;很多Web2.0网站都使用Email地址作为登录用户名&#xff0c;其有如下优点&#xff1a; 1. 不易重复。用户名经常会重复&#xff0c;导致用户不得不在多个网站之间使用多种不同的用户名&#xff0c;不易记忆和管理&#xff1b;而Email地址具有唯一性。 2. …

随机森林算法简介

今天在练习 Kaggle 的项目时&#xff0c;发现网上很多博主都选择用 RandomForest &#xff08;随机森林&#xff09;算法训练模型&#xff0c;虽然最后参照他们的写法我也写出来了&#xff0c;但是没有很明白其中的原理&#xff0c;在此打算深入了解一下这个算法。 1. 什么是随…

再现“山寨熊猫” 泰然逛街雷倒众人

近日&#xff0c;吉林市冒出一只“山寨熊猫”&#xff0c;不仅雷到了人&#xff0c;还雷到了街头的宠物狗。把宠物生活馆开到吉林市的北京市民张先生是这只“山寨熊猫”的主人。他半开玩笑地说:“熊猫可是国宝啊&#xff01;可太稀有了&#xff0c;我们可以自己造。”为了设计这…

刚开发好得一CS版车辆防盗、监控、调度系统,使用最新的全国mapinfo 格式地图...

支持多协议&#xff08;可另添加协议&#xff09;&#xff0c;多通道&#xff08;gprs/移动短信接口/短信猫&#xff09;&#xff0c;操作简单&#xff0c;此软件为自己开发&#xff0c;因此可以提供足够的技术支持。 基本功能&#xff1a; 1、车辆监控定位、历史轨迹(动态回放…

Python reshape() 函数用法

reshape&#xff08;&#xff09;函数用于在不更改数据的情况下为数组赋予新形状。 1. 语法 numpy.reshape(a, newshape, order‘C’) 参数名参数解释参数是否必要a需要 reshape 的数组是newshape新形状应与原始形状兼容。如果是整数&#xff0c;则结果将是该长度的一维数组。…