ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

排序算法之堆排序【小二讲堂】

2019-05-03 17:56:43  阅读:292  来源: 互联网

标签:temp int 堆排序 讲堂 child array 排序 节点


【排序思想】:
大顶堆:堆的每个父节点都大于其孩子节点
小顶堆:堆的每个度节点都小于其孩子节点
堆排序的概要:首先对于一组数据,将这组数据填入到一个二叉树中,这是构成了初始堆
A. 将初始堆进行排序,排序成一个大顶堆(或小顶对),将子节点与其父节点进行比较数据大的放在父节点的位置,直到生成一个大顶堆.
B. 进行排序输出,规则,将跟节点上的数据进行与子节点中最小的数进行比较,将较小的数据交换至根节点,将最大的数进行输出,
C. 将最大的数进行输出后,进行筛选调整,根据A中排大顶堆的方法,进行排序,将根节点上的数据放到被输出数的孩子树枝上,然后进行交换输出,
。。。由上几步可以得出排序结果
堆排序图示:
构建初始堆:
在这里插入图片描述
开始排序:
在这里插入图片描述
【代码演示】

	public static void sort(int[] array) {

	    init(array);

	    // 这个过程就是不断的从堆顶移除,调整

	    for (int i = 1; i < array.length; i++) {

	       int temp = array[0];

	       int end = array.length - i;

	       array[0] = array[end];

	       array[end] = temp;

	       adjust(array, 0, end);

	    }
	}

	//初始化堆,对对进行排序
	private static void init(int[] array) {

	    for (int i = array.length / 2 - 1; i >= 0; i--) {

	       adjust(array, i, array.length);

	    }

	}
	//进行判断比较排序
	private static void adjust(int[] array, int n, int size) {

	    int temp = array[n]; // 先拿出数据

	    int child = n * 2 + 1; // 这个是左孩子

	    while (child < size) { // 这个保证还有左孩子

	       // 如果右孩子也存在的话,并且右孩子的值比左孩子的大

	       if (child + 1 < size && array[child + 1] > array[child]) {
	           child++;
	       }

	       if (array[child] > temp) {

	           array[n] = array[child];

	           n = child; // n需要重新计算

	           child = n * 2 + 1; // 重新计算左孩子

	       } else {

	           // 这种情况说明左右孩子的值都比父结点的值小

	           break;

	       }
	    }
	    array[n] = temp;
	}

小二讲堂:https://me.csdn.net/Mirror_w
排序算法大全:https://blog.csdn.net/mirror_w/article/category/8856271

标签:temp,int,堆排序,讲堂,child,array,排序,节点
来源: https://blog.csdn.net/Mirror_w/article/details/89789477

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有