Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320984
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 179
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-09 18:16
文章分类

全部博文(15)

文章存档

2019年(1)

2018年(1)

2015年(7)

2013年(6)

我的朋友

分类: Java

2013-10-09 15:38:21

实现思路:
1.构造最大堆
2.将跟元素替换到最后,减少堆大小并调整堆。

点击(此处)折叠或打开

  1. package sort;

  2. import java.util.Random;

  3. public class HeapSort {
  4.     public static void main(String[] args) {
  5.         //初始化数组
  6.         int N = 1000000;
  7.         int[] arr = new int[N];
  8.         for (int k = 0; k < arr.length; k++) {
  9.             arr[k] = new Random().nextInt(100);
  10.         }
  11.         try {
  12.             //堆排序
  13.             HeapSort heapSort = new HeapSort();
  14.             heapSort.heapSort(arr);
  15.         } catch (Exception e) {
  16.             e.printStackTrace();
  17.         }
  18. //        for (int k = 0; k < arr.length; k++) {
  19. //            System.out.print(arr[k] + ", ");
  20. //        }
  21.     }
  22.     
  23.     /**
  24.      * 堆排序
  25.      * @param A
  26.      */
  27.     public void heapSort(int[] A) {
  28.         buildMaxHeap(A); //构建最大堆,
  29.         int heapSize = A.length;
  30.         int temp;
  31.         for (int i = A.length - 1; i >= 1; i--){
  32.             //将根元素与堆得最好一个元素互换
  33.             temp = A[0];
  34.             A[0] = A[i];
  35.             A[i] = temp;
  36.             heapSize--;
  37.             //减少堆的大小,对剩余元素维持最大堆性质
  38.             maxHeapify(A, 0, heapSize);
  39.         }
  40.     }
  41.     
  42.     /**
  43.      * 构建最大堆,父节点大于等于子节点
  44.      * @param A 对象数组
  45.      */
  46.     private void buildMaxHeap(int[] A) {
  47.         int heapSize = A.length;
  48.         //堆非叶节点调整
  49.         for (int i = A.length / 2 - 1; i >= 0; i-- ) {
  50.             maxHeapify(A, i, heapSize);
  51.         }
  52.     }
  53.     
  54.     /**
  55.      * 维持堆性质
  56.      * @param A 数组
  57.      * @param i 元素index
  58.      * @param heapSize 堆大小
  59.      */
  60.     private void maxHeapify(int[] A, int i, int heapSize) {
  61.         int left = 2 * i + 1; //左值
  62.         int right = 2 * i + 2; //右值
  63.         int largest = i; //三者中最大的
  64.         if (left < heapSize && A[left] > A[i]) {
  65.             largest = left;            
  66.         }
  67.         if (right < heapSize && A[right] > A[largest]) {
  68.             largest = right;            
  69.         }
  70.         if (largest != i) {
  71.             int temp = A[i];
  72.             A[i] = A[largest];
  73.             A[largest] = temp;
  74.             maxHeapify(A, largest, heapSize);
  75.         }
  76.     }
  77. }

阅读(1100) | 评论(0) | 转发(0) |
0

上一篇:最大子数组问题

下一篇:Linux find命令

给主人留下些什么吧!~~