堆排序:
一棵完全二叉树,如果父节点的值大于等于左右节点的值,则称此完全二叉树为小根堆(小顶堆);如果父节点的值小于等于左右节点的值,则次完全二叉树为大根堆(大顶堆)。

堆排序是建立在大顶堆或小顶堆的基础上的,通过不断的交换堆顶元素和堆尾元素,来对数组排序。基于大顶堆的堆排序,数组排序结果是升序的。基于小顶堆的堆排序,数组排序结果是降序的。

流程:
(1)建立堆 (注意调整的顺序是:从右往左,从下往上)
(2)交换堆顶与堆底元素
(3)调整堆(注意调整的顺序是:从0开始)

代码:

public class DuiPaiXu {
//堆排序
public static void heapSort(int[] array) {
if(array == null || array.length <=1 ) {
return;
} int totalIndex = array.length-1;
buildHeap(array,totalIndex); while(totalIndex > 0) {
swap(array,0,totalIndex);
if(--totalIndex == 0) {
break;
}
adjustHeap(array,0, totalIndex);
}
} //根据数组建立堆
public static void buildHeap(int[] array,int totalIndex) {
  //注意这里i是从(totalIndex-1)/2-1开始的,因为我索引值是从0开始的。
for(int i=(totalIndex-1)/2-1; i>=0; i--) {
adjustHeap(array,i, totalIndex);
}
} //调整堆
public static void adjustHeap(int[] array,int curIndex, int totalIndex) {
int biggestIndex = curIndex;
int leftIndex = 2*curIndex +1;
int rightIndex = 2*curIndex +2; if(rightIndex <= totalIndex) {
if(array[curIndex] <array[leftIndex] || array[curIndex] <array[rightIndex]) {
biggestIndex = array[leftIndex] > array[rightIndex] ? leftIndex : rightIndex;
}
} else if(leftIndex <= totalIndex ) {
if(array[curIndex] <array[leftIndex]) {
biggestIndex = leftIndex;
}
} if(biggestIndex != curIndex) {
swap(array, curIndex, biggestIndex); adjustHeap(array, biggestIndex, totalIndex);
} } public static void swap(int[] array,int i1, int i2) {
int temp = array[i1];
array[i1] = array[i2];
array[i2] = temp;
} public static void main(String[] args) {
int[] array = {1,3,76,34,23,45,85,46,37};
heapSort(array);
for(int i=0; i<array.length; i++) {
System.out.print(array[i] + " ");
}
}
}

最新文章

  1. AES加密解密通用版Object-C / C# / JAVA
  2. laravel 操作 redis
  3. 【HDU2896】病毒侵袭 AC自动机
  4. 有关binlog的那点事(mysql5.7.13)
  5. javascript学习之带滚动条的图片
  6. Javascript快速入门(下篇)
  7. python click module for command line interface
  8. 复习课程jdbc:使用配置文件properties进行连接数据库,数据库存取图片,批处理,时间戳,事物回滚等等
  9. URAL 1097 Square Country 2 离散化
  10. Android 自定义控件-TextView
  11. bzoj1072
  12. eclipse下使用hibernate tools实现hibernate逆向工程
  13. 风行一时瀑布流网页布局,实现无限加载(jquery)
  14. ArcGIS API for JavaScript 4.2学习笔记[13] Layer的弹窗(PopupTemplate)
  15. ES6之Promise学习与实践
  16. nginx 1.14.2 配置文件优化精选
  17. Python 函数中参数的分类及使用
  18. SpringBoot系列——mail
  19. vue.js简单添加和删除
  20. 第五章:Android布局

热门文章

  1. Spring定时器实现(二)
  2. Accord.NET_Naive Bayes Classifier
  3. 从 Vue 1.x 迁移 — Vue.js
  4. 被DDOS攻击的解决方法
  5. [补档]暑假集训D3总结
  6. 安装完jdk配置环境变量
  7. 自定义Git之忽略特殊文件
  8. POJ 2479 Maximum sum 解题报告
  9. Spring思维导图(MVC篇)
  10. this和super关键字在构造器中放置第一行的原因