排序算法三:堆排序(Heapsort)
堆排序(Heapsort)是一种利用数据结构中的堆进行排序的算法,分为构建初始堆,减小堆的元素个数,调整堆共3步。
(一)算法实现
- protected void sort(int[] toSort) {
- buildHeap(toSort);
- for (int i = toSort.length - 1; i > 0; i--) {
- CommonUtils.swap(toSort, 0, i);
- adjustHeap(toSort, 0, i);
- }
- }
- /**
- *
- * @param toSort
- * array of heap, begins from 0
- * @param index
- * index to adjust
- * @param size
- * size of heap
- */
- private void adjustHeap(int[] toSort, int index, int size) {
- int leftNode = index * 2 + 1;
- int rightNode = leftNode + 1;
- int maxIndex = index;
- if (leftNode < size && toSort[leftNode] > toSort[maxIndex]) {
- maxIndex = leftNode;
- }
- if (rightNode < size && toSort[rightNode] > toSort[maxIndex]) {
- maxIndex = rightNode;
- }
- if (maxIndex != index) {
- CommonUtils.swap(toSort, index, maxIndex);
- adjustHeap(toSort, maxIndex, size);
- }
- }
- /**
- *
- * @param toSort
- * array to sort
- */
- private void buildHeap(int[] toSort) {
- int lastNonLeaf = toSort.length / 2 - 1;
- for (int i = lastNonLeaf; i >= 0; i--) {
- adjustHeap(toSort, i, toSort.length);
- }
- }
Heap sort
1)堆排序是原地排序
2)堆排序的时间复杂度是O(nlgn)
3)堆排序属于比较排序
4)堆排序不是稳定排序算法
(二)仿真结果
**************************************************
Number to Sort is:2500
Array to sort is:{419836,72576,347420,355422,378503,65556,443634,137868,266344,918856...}
Cost time of 【HeapSort】 is(milliseconds):1
Sort result of 【HeapSort】:{185,874,996,1232,1448,2357,2728,2854,3137,3291...}
**************************************************
Number to Sort is:25000
Array to sort is:{169570,655593,54301,59080,890711,224726,720131,590749,600165,681962...}
Cost time of 【HeapSort】 is(milliseconds):7
Sort result of 【HeapSort】:{9,107,119,192,297,321,338,359,359,362...}
**************************************************
Number to Sort is:250000
Array to sort is:{233097,327821,972339,26697,803510,598167,178244,117664,904299,195258...}
Cost time of 【HeapSort】 is(milliseconds):59
Sort result of 【HeapSort】:{0,1,3,8,16,24,32,37,45,52...}
相关代码:
- package com.cnblogs.riyueshiwang.sort;
- import java.util.Arrays;
- public class HeapSort extends abstractSort {
- @Override
- protected void sort(int[] toSort) {
- buildHeap(toSort);
- for (int i = toSort.length - 1; i > 0; i--) {
- CommonUtils.swap(toSort, 0, i);
- adjustHeap(toSort, 0, i);
- }
- }
- /**
- *
- * @param toSort
- * array of heap, begins from 0
- * @param index
- * index to adjust
- * @param size
- * size of heap
- */
- private void adjustHeap(int[] toSort, int index, int size) {
- int leftNode = index * 2 + 1;
- int rightNode = leftNode + 1;
- int maxIndex = index;
- if (leftNode < size && toSort[leftNode] > toSort[maxIndex]) {
- maxIndex = leftNode;
- }
- if (rightNode < size && toSort[rightNode] > toSort[maxIndex]) {
- maxIndex = rightNode;
- }
- if (maxIndex != index) {
- CommonUtils.swap(toSort, index, maxIndex);
- adjustHeap(toSort, maxIndex, size);
- }
- }
- /**
- *
- * @param toSort
- * array to sort
- */
- private void buildHeap(int[] toSort) {
- int lastNonLeaf = toSort.length / 2 - 1;
- for (int i = lastNonLeaf; i >= 0; i--) {
- adjustHeap(toSort, i, toSort.length);
- }
- }
- public static void main(String[] args) {
- for (int j = 0, n = 2500; j < 3; j++, n = n * 10) {
- System.out
- .println("**************************************************");
- System.out.println("Number to Sort is:" + n);
- int[] array = CommonUtils.getRandomIntArray(n, 1000000);
- System.out.print("Array to sort is:");
- CommonUtils.printIntArray(array);
- int[] array1 = Arrays.copyOf(array, n);
- new HeapSort().sortAndprint(array1);
- }
- }
- }
HeapSort.java
排序算法三:堆排序(Heapsort)的更多相关文章
- 排序算法FOUR:堆排序HeapSort
/** *堆排序思路:O(nlogn) * 用最大堆,传入一个数组,先用数组建堆,维护堆的性质 * 再把第一个数与堆最后一个数调换,因为第一个数是最大的 * 把堆的大小减小一 * 再 在堆的大小上维护 ...
- 排序算法三:Shell插入排序
排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...
- Java常见排序算法之堆排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 排序算法之堆排序(Heapsort)解析
一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复 ...
- 《排序算法》——堆排序(大顶堆,小顶堆,Java)
十大算法之堆排序: 堆的定义例如以下: n个元素的序列{k0,k1,...,ki,-,k(n-1)}当且仅当满足下关系时,称之为堆. " ki<=k2i,ki<=k2i+1;或k ...
- Java排序算法之堆排序
堆的概念: 堆是一种完全二叉树,非叶子结点 i 要满足key[i]>key[i+1]&&key[i]>key[i+2](最大堆) 或者 key[i]<key[i+1] ...
- 数据结构与算法之PHP排序算法(堆排序)
一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...
- C++编程练习(13)----“排序算法 之 堆排序“
堆排序 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(也叫最大堆):或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆(也叫最小堆). 最小堆和最大堆如 ...
- 八大排序算法之七—堆排序(Heap Sort)
堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素) ...
随机推荐
- 在Centos7.6使用kubeadm部署k8s 1.14.3
K8s不是一个软件,而是一堆软件的集合,由于这堆软件各自独立,因此可能k8s安装过程很容易出现问题 K8s部署有多种方式,本文使用kubeadm部署,从易操作性和可控性来说属于中等的方式 环境:cen ...
- Python 3实现网页爬虫
1 什么是网页爬虫 网络爬虫( 网页蜘蛛,网络机器人,网页追逐者,自动索引,模拟程序)是一种按照一定的规则自动地抓取互联网信息的程序或者脚本,从互联网上抓取对于我们有价值的信息.Tips:自动提取网页 ...
- latex如何给表格添加注释
在latex中,想给表格添加注释,可以使用threeparttable这个包 代码如下: \usepackage{threeparttable} \begin{table*} \begin{three ...
- 从0构建webpack开发环境(一) 一个简单webpack.config.js
本文基于webpack4.X,使用的包管理工具是yarn 概念相关就不搬运了,直接开始 首先项目初始化 mkdir webpack-demo && cd webpack-demo ya ...
- js函数总结
最近要经常写一些Js代码,总看到同事能使用js高级函数写出比较简洁的js代码,挺羡慕的,于是就花了一些专门时间来学习. forEach.map.reduce 我就不喜欢一上来就给出语法来,先来一个例子 ...
- 12JDBC
1.JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...
- basename 显示文件名或目录名
1. 命令功能 basename 显示文件名或目录名,不显示文件的全路径文件名 2. 语法格式 basename 文件路径名 3. 使用范例 [root@localhost data]# basen ...
- R语言 Keras Training Flags
在需要经常进行调参的情况下,可以使用 Training Flags 来快速变换参数,比起直接修改模型参数来得快而且不易出错. https://tensorflow.rstudio.com/tools/ ...
- Linux 系统参数优化
修改系统所有进程可打开的文件数量 sysctl -w fs.file-max=2097152sysctl -w fs.nr_open=2097152 > vi /etc/sysctl.conff ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...