堆排序(Heapsort)是一种利用数据结构中的堆进行排序的算法,分为构建初始堆,减小堆的元素个数,调整堆共3步。

(一)算法实现

  1. protected void sort(int[] toSort) {
  2. buildHeap(toSort);
  3. for (int i = toSort.length - 1; i > 0; i--) {
  4. CommonUtils.swap(toSort, 0, i);
  5. adjustHeap(toSort, 0, i);
  6. }
  7. }
  8.  
  9. /**
  10. *
  11. * @param toSort
  12. * array of heap, begins from 0
  13. * @param index
  14. * index to adjust
  15. * @param size
  16. * size of heap
  17. */
  18. private void adjustHeap(int[] toSort, int index, int size) {
  19. int leftNode = index * 2 + 1;
  20. int rightNode = leftNode + 1;
  21.  
  22. int maxIndex = index;
  23. if (leftNode < size && toSort[leftNode] > toSort[maxIndex]) {
  24. maxIndex = leftNode;
  25. }
  26. if (rightNode < size && toSort[rightNode] > toSort[maxIndex]) {
  27. maxIndex = rightNode;
  28. }
  29. if (maxIndex != index) {
  30. CommonUtils.swap(toSort, index, maxIndex);
  31. adjustHeap(toSort, maxIndex, size);
  32. }
  33.  
  34. }
  35.  
  36. /**
  37. *
  38. * @param toSort
  39. * array to sort
  40. */
  41. private void buildHeap(int[] toSort) {
  42. int lastNonLeaf = toSort.length / 2 - 1;
  43. for (int i = lastNonLeaf; i >= 0; i--) {
  44. adjustHeap(toSort, i, toSort.length);
  45. }
  46. }

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...}

相关代码:

  1. package com.cnblogs.riyueshiwang.sort;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class HeapSort extends abstractSort {
  6. @Override
  7. protected void sort(int[] toSort) {
  8. buildHeap(toSort);
  9. for (int i = toSort.length - 1; i > 0; i--) {
  10. CommonUtils.swap(toSort, 0, i);
  11. adjustHeap(toSort, 0, i);
  12. }
  13. }
  14.  
  15. /**
  16. *
  17. * @param toSort
  18. * array of heap, begins from 0
  19. * @param index
  20. * index to adjust
  21. * @param size
  22. * size of heap
  23. */
  24. private void adjustHeap(int[] toSort, int index, int size) {
  25. int leftNode = index * 2 + 1;
  26. int rightNode = leftNode + 1;
  27.  
  28. int maxIndex = index;
  29. if (leftNode < size && toSort[leftNode] > toSort[maxIndex]) {
  30. maxIndex = leftNode;
  31. }
  32. if (rightNode < size && toSort[rightNode] > toSort[maxIndex]) {
  33. maxIndex = rightNode;
  34. }
  35. if (maxIndex != index) {
  36. CommonUtils.swap(toSort, index, maxIndex);
  37. adjustHeap(toSort, maxIndex, size);
  38. }
  39.  
  40. }
  41.  
  42. /**
  43. *
  44. * @param toSort
  45. * array to sort
  46. */
  47. private void buildHeap(int[] toSort) {
  48. int lastNonLeaf = toSort.length / 2 - 1;
  49. for (int i = lastNonLeaf; i >= 0; i--) {
  50. adjustHeap(toSort, i, toSort.length);
  51. }
  52. }
  53.  
  54. public static void main(String[] args) {
  55. for (int j = 0, n = 2500; j < 3; j++, n = n * 10) {
  56. System.out
  57. .println("**************************************************");
  58. System.out.println("Number to Sort is:" + n);
  59. int[] array = CommonUtils.getRandomIntArray(n, 1000000);
  60. System.out.print("Array to sort is:");
  61. CommonUtils.printIntArray(array);
  62.  
  63. int[] array1 = Arrays.copyOf(array, n);
  64. new HeapSort().sortAndprint(array1);
  65. }
  66. }
  67. }

HeapSort.java

排序算法三:堆排序(Heapsort)的更多相关文章

  1. 排序算法FOUR:堆排序HeapSort

    /** *堆排序思路:O(nlogn) * 用最大堆,传入一个数组,先用数组建堆,维护堆的性质 * 再把第一个数与堆最后一个数调换,因为第一个数是最大的 * 把堆的大小减小一 * 再 在堆的大小上维护 ...

  2. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  3. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. 排序算法之堆排序(Heapsort)解析

    一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复 ...

  5. 《排序算法》——堆排序(大顶堆,小顶堆,Java)

    十大算法之堆排序: 堆的定义例如以下: n个元素的序列{k0,k1,...,ki,-,k(n-1)}当且仅当满足下关系时,称之为堆. " ki<=k2i,ki<=k2i+1;或k ...

  6. Java排序算法之堆排序

    堆的概念: 堆是一种完全二叉树,非叶子结点 i 要满足key[i]>key[i+1]&&key[i]>key[i+2](最大堆) 或者 key[i]<key[i+1] ...

  7. 数据结构与算法之PHP排序算法(堆排序)

    一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...

  8. C++编程练习(13)----“排序算法 之 堆排序“

    堆排序 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(也叫最大堆):或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆(也叫最小堆). 最小堆和最大堆如 ...

  9. 八大排序算法之七—堆排序(Heap Sort)

    堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素) ...

随机推荐

  1. 在Centos7.6使用kubeadm部署k8s 1.14.3

    K8s不是一个软件,而是一堆软件的集合,由于这堆软件各自独立,因此可能k8s安装过程很容易出现问题 K8s部署有多种方式,本文使用kubeadm部署,从易操作性和可控性来说属于中等的方式 环境:cen ...

  2. Python 3实现网页爬虫

    1 什么是网页爬虫 网络爬虫( 网页蜘蛛,网络机器人,网页追逐者,自动索引,模拟程序)是一种按照一定的规则自动地抓取互联网信息的程序或者脚本,从互联网上抓取对于我们有价值的信息.Tips:自动提取网页 ...

  3. latex如何给表格添加注释

    在latex中,想给表格添加注释,可以使用threeparttable这个包 代码如下: \usepackage{threeparttable} \begin{table*} \begin{three ...

  4. 从0构建webpack开发环境(一) 一个简单webpack.config.js

    本文基于webpack4.X,使用的包管理工具是yarn 概念相关就不搬运了,直接开始 首先项目初始化 mkdir webpack-demo && cd webpack-demo ya ...

  5. js函数总结

    最近要经常写一些Js代码,总看到同事能使用js高级函数写出比较简洁的js代码,挺羡慕的,于是就花了一些专门时间来学习. forEach.map.reduce 我就不喜欢一上来就给出语法来,先来一个例子 ...

  6. 12JDBC

    1.JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...

  7. basename 显示文件名或目录名

    1. 命令功能 basename 显示文件名或目录名,不显示文件的全路径文件名 2. 语法格式 basename  文件路径名 3. 使用范例 [root@localhost data]# basen ...

  8. R语言 Keras Training Flags

    在需要经常进行调参的情况下,可以使用 Training Flags 来快速变换参数,比起直接修改模型参数来得快而且不易出错. https://tensorflow.rstudio.com/tools/ ...

  9. Linux 系统参数优化

    修改系统所有进程可打开的文件数量 sysctl -w fs.file-max=2097152sysctl -w fs.nr_open=2097152 > vi /etc/sysctl.conff ...

  10. python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

    昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...