Java 排序之 堆排序
2014-08-06 23:28
211 查看
堆排序:具有原址性 且 复杂度为O(nlgn)
集中了插入排序和归并排序的优点。
堆 是一个数组,可以看成一个近似的完全二叉树,除了最底层外,该树是完全充满的。而且从左到右从满。
给定一个节点的下标为i,
父节点: i/2
左节点下标
Left(i) = 2 * i;
右节点下标
Right(i) = 2*i +1;
如果下标冲0 开始而不是1开始的话
int left = index * 2+1;
int right = index * 2 + 2;
最大堆:
堆中最大的元素放在跟节点中,该子树包含的所有节点的值都不得大于该子树的根节点的值。
集中了插入排序和归并排序的优点。
堆 是一个数组,可以看成一个近似的完全二叉树,除了最底层外,该树是完全充满的。而且从左到右从满。
给定一个节点的下标为i,
父节点: i/2
左节点下标
Left(i) = 2 * i;
右节点下标
Right(i) = 2*i +1;
如果下标冲0 开始而不是1开始的话
int left = index * 2+1;
int right = index * 2 + 2;
最大堆:
堆中最大的元素放在跟节点中,该子树包含的所有节点的值都不得大于该子树的根节点的值。
public void heapSort(int[] array){ buildMaxHeap(array); int heapSize = array.length; for(int i = array.length-1;i>0;i--){ swap(array,0,i); heapSize--; maxHeapify(array,heapSize,0); } } public void maxHeapify(int[] array, int heapSize,int index){ int left = index * 2+1; int right = index * 2 + 2; int largest = index; if(left < heapSize && array[left] > array[index]) largest = left; if(right < heapSize && array[right] > array[largest])// largest 而不是 index largest = right; if(largest != index){ swap(array,index,largest); maxHeapify(array, heapSize, largest); } } public void buildMaxHeap(int[] array){ int heapSize = array.length; for(int i = heapSize/2; i >= 0;i--){ maxHeapify(array,heapSize,i); } }
相关文章推荐
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- java五种内部排序(直接插入排序、希尔排序、快速排序、堆排序、归并排序)
- 插入排序,希尔排序,堆排序,归并排序,快速排序Java实现
- 整型溢出 & sleep() wait() 的区别 & Java 堆排序 快速排序 计数排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 算法之排序小结3---堆排序(Java)
- 排序算法--选择排序(简单选择排序、堆排序)java实现
- 堆排序-Java小顶堆排序
- Java实现常见排序--希尔排序、快排序、堆排序、归并排序等Java实现代码
- 【转】排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- java数据结构之插入排序(选择排序(直接选择排序、堆排序))
- Java排序之堆排序
- 选择排序、树形排序、堆排序的java代码实现
- 选择排序之堆排序Java实现