堆排序

作者: FORGET_静哥哥 | 来源:发表于2019-02-15 09:42 被阅读1次


package com.xj.www.sort;
/**
 * 堆排序算法
 *
 * @author xiongjing
 *
 */
public class HeapSort {
      final static int SIZE = 10;
      // 堆排序算法具体实现
      public static void heap(int a[], int n) {
            int i, j, h, k, t;
            // 将a[0,n-1]建成大根堆
            for (i = n / 2 - 1; i >= 0; i--) {
                  // 第i个结点有右子树
                  while (2 * i + 1 < n) {
                        j = 2 * i + 1;
                        if ((j + 1) < n) {
                              // 左子树小于右子树,需要比较右子树
                              if (a[j] < a[j + 1]) {
                                    // 序号增加1,指向右子树
                                    j++;
                              }
                        }
                        // 比较i与j为序号的数据
                        if (a[i] < a[j]) {
                              // 交换数据
                              t = a[i];
                              a[i] = a[j];
                              a[j] = t;
                              // 堆被破坏,需要重新调整
                              i = j;
                        }
                        // 比较左右子结点均大则堆未破坏,不再需要调整
                        else {
                              break;
                        }
                  }
            }
            // 输出构成的堆
            System.out.print("原数据构成的堆:");
            for (h = 0; h < n; h++) {
                  System.out.print(" " + a[h]);
            }
            System.out.println("\n");
            for (i = n - 1; i > 0; i--) {
                  // 与第i个记录交换
                  t = a[0];
                  a[0] = a[i];
                  a[i] = t;
                  k = 0;
                  // 第i个结点有右子树
                  while (2 * k + 1 < i) {
                        j = 2 * k + 1;
                        if ((j + 1) < i) {
                              // 左子树小于右子树,则需要比较右子树
                              if (a[j] < a[j + 1]) {
                                    // 序号增加1,指向右子树
                                    j++;
                              }
                        }
                        // 比较i与j为序号的数据
                        if (a[k] < a[j]) {
                              // 交换数据
                              t = a[k];
                              a[k] = a[j];
                              a[j] = t;
                              // 堆被破坏,需要重新调整
                              k = j;
                        }
                        // 比较左右子节点均大则未破坏,不需要再调整
                        else {
                              break;
                        }
                  }
                  // 输出每步排序的结果
                  System.out.print("第" + (n - i) + "步排序结果:");
                  for (h = 0; h < n; h++) {
                        System.out.print(" " + a[h]);
                  }
                  System.out.print("\n");
            }
      }
      // 程序主入口
      public static void main(String[] args) {
            int[] shuzu = new int[SIZE];
            int i;
            for (i = 0; i < SIZE; i++) {
                  shuzu[i] = (int) (100 + Math.random() * (100 + 1));
            }
            System.out.println("排序前的数组为:");
            for (i = 0; i < SIZE; i++) {
                  System.out.print(shuzu[i] + " ");
            }
            System.out.print("\n");
            heap(shuzu, SIZE);
            System.out.println("排序后的数组为:");
            for (i = 0; i < SIZE; i++) {
                  System.out.print(shuzu[i] + " ");
            }
            System.out.print("\n");
      }
}

相关文章

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 堆和堆排序

    最小K个数 堆排序 堆排序

  • JS实现堆排序

    原理 堆排序原理 实现 说明 堆排序对大文件很有效 堆排序是不稳定排序

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 排序

    原创 堆排序: 使用visit数组从本质出发获取大顶堆排序。

  • 堆排序

    堆排序

  • C++基础入门之模板堆排序(上):模板上的list的创造与操作

    整段源码链接C++的模板元堆排序 要点 组建数据结构list 组建对list的各种基本操作 堆排序中组建堆排序个个...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

网友评论

    本文标题:堆排序

    本文链接:https://www.haomeiwen.com/subject/tgtpeqtx.html