排序算法(七) 堆排序
来源:互联网 发布:编程器使用方法 编辑:程序博客网 时间:2024/06/04 19:21
package study;public class SortNumberTest { public static void main(String[] args) { Test1(); } public static void Test1(){ System.out.println("堆排序"); int[] numbers8={5, 3, 6, 2, 1, 9, 4, 8, 7}; heapSort(numbers8); System.out.println("..................................."); } //堆排序 public static void heapSort(int[] numbers) { print(numbers); createMaxdHeap(numbers); for (int i = 0; i < numbers.length-1; i++) { Maxify(numbers,numbers.length-1-i,0); swap(numbers, 0, numbers.length - 1 - i); print2(numbers); } } private static void createMaxdHeap(int[] numbers){ for (int i = numbers.length/ 2-1; i >= 0; i--) { //取值依据:若总数为n,则取最后一个有子节点的元素 n/2,需要换算成下标从0开始的情况 Maxify(numbers,numbers.length-1,i); } } private static void Maxify(int[] numbers, int lastIndex,int k) { // 若当前节点的子节点存在(至少存在左节点) while (2 * k + 1 <= lastIndex) { //取值依据,第n个元素,左节点是2n,右节点是2n+1,需要换算成下标从0开始的情况 int biggerIndex = 2 * k + 1; //左节点 if (biggerIndex < lastIndex) { //判断右节点是否存在 if (numbers[biggerIndex + 1]<numbers[biggerIndex] ) { // 小根堆取较小值 biggerIndex++; } } // 如有必要调整顺序,否则已不必再往下比较 if (numbers[k] > numbers[biggerIndex]) { print2(numbers); swap(numbers, k, biggerIndex); k = biggerIndex; } else { break; } } } private static void swap(int[] numbers, int a, int b) { int t = numbers[a]; numbers[a] = numbers[b]; numbers[b] = t; } private static void print(int[] numbers){ for (int i = 0; i < numbers.length; i++) { System.out.print(numbers[i]+" "); } System.out.println(); } //打印堆,深度暂时定死为4 private static void print2(int[] numbers){ int t=1; int begin=0; int gap=0; for (int i = 0; i < numbers.length; i++) { switch (i) {case 0:gap=7;break;case 1:gap=3;break;case 2:gap=7;break;case 3:gap=1;break;case 4:case 5:case 6:gap=3;break;case 7:gap=0;break;default:gap=1;break;} if(gap>0){ System.out.printf("%"+gap+"s"," "); } System.out.print(numbers[i]); begin++; if(begin==t){//换行 System.out.println(); t=t*2; begin=0; } } System.out.println(); } }
0 0
- 排序算法(七) 堆排序
- 排序算法(七)-堆排序
- 堆排序(七)
- 排序算法(七)——堆排序
- 排序算法(七)——堆排序
- 排序算法(七):JAVA实现堆排序
- 排序算法(七)——堆排序
- 排序算法七:选择排序之堆排序
- 排序算法七:选择排序之堆排序
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- 算法相关——Java排序算法之堆排序(七)
- 基于JAVA的排序算法之七--堆排序
- 排序七之堆排序
- 七种排序算法,包括:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 白话经典算法系列之七 堆与堆排序
- 运用循环输出一个空心的菱形
- 事件(三)
- Android闪光灯实现
- poj2367(拓扑排序)
- 归并排序
- 排序算法(七) 堆排序
- VIM for windows
- JAVA养成计划——每天学一点JAVA
- 关于中文乱码这坑
- 一道常被人轻视的前端JS面试题
- IOS的基本控件的使用-UIViewController基础
- 从0开始学习 GITHUB 系列之「初识 GITHUB」
- 快速排序
- 网站图片变灰的通用CSS解决方案