堆排序(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)的更多相关文章

  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. javascript中slice(),splice(),split(),substring(),substr()使用方法

    因为本人在使用这些方法时常有混淆,特总结如下: 1.slice(): Array和String对象都有 在Array中  slice(i,[j]) i为开始截取的索引值,负数代表从末尾算起的索引值,- ...

  2. Spark集成Kafka实时流计算Java案例

    package com.test; import java.util.*; import org.apache.spark.SparkConf; import org.apache.spark.Tas ...

  3. 2018-8-10-WPF-控件继承树

    title author date CreateTime categories WPF 控件继承树 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 17:23: ...

  4. webpack 4.0 报错

    ERROR in multi ./src/entery.js dist/bundle.jsModule not found: Error: Can't resolve 'dist/bundle.js' ...

  5. hdu 4643 GSM(暴力)

    GSM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submis ...

  6. 安装kafka多节点

    安装多节点的kafka只需要创建多份配置文件(server.properties),然后指定他们启动kafka服务即可,本例中采用一台服务器来模拟3个节点的kafka集群搭建.同理,使用一台服务器搭建 ...

  7. RMQ HelloWorld

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11791681.html Project Directory Maven Dependency < ...

  8. hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】

    题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include< ...

  9. python生成HTMl报告(unittest)

      Python3 使用HTMLTestRunner.py 报错ImportError: No module named 'StringIO'处理方法 HTMLTestRunner.py文件是基于Py ...

  10. Intent.java分析

    代码位于frameworks/base/core/java/anroid/Content/Intent.java Intent是对要进行操作的一种抽象描述.用action抽象操作,用data(andr ...