`
kobe学java
  • 浏览: 257997 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

堆排序(Heap Sort),java版.

    博客分类:
  • java
 
阅读更多

堆排序(Heap Sort),java版.

发表于:2008年12月28日 | 分类:算法 | 标签: sort | views(2,392)

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.

 

原文出处:http://blog.chenlb.com/2008/12/heap-sort-for-java.html

堆排序是高效的排序方法。没有最坏情况(即与平均情况一样),空间占用又小,综合效率比快速排序还好。

堆排序原理:1、从数据集中构建大顶堆(或小顶堆)。2、堆顶与最后一个数据交换,然后维护堆顶使它还是大顶堆(或小顶堆)。3、重复2的过程,直到剩下一个数据。
时间复杂度:平均O(nlog2n),最坏情况O(nlog2n)。

示例代码:

  1. package com.chenlb.sort;  
  2.   
  3. import java.util.Arrays;  
  4.   
  5. /** 
  6.  * 堆排序. 
  7.  * 
  8.  * @author chenlb 2008-12-28 下午03:52:53 
  9.  */  
  10. public class HeapSort {  
  11.   
  12.     private static int parentIdx(int childIdx) {  
  13.         return (childIdx - 1) / 2;  //索引从0开始, 注意childIdx=0时返回0  
  14.     }  
  15.   
  16.     private static int leftChildIdx(int parentIdx) {  
  17.         return parentIdx*2 + 1;  
  18.     }  
  19.   
  20.     /** 
  21.      * 构建大顶堆. 
  22.      * @author chenlb 2008-12-28 下午03:52:23 
  23.      */  
  24.     private static void buildMaxHeap(int[] datas) {  
  25.         int lastIdx = datas.length -1;  
  26.         for(int i=parentIdx(lastIdx); i>=0; i--) {  
  27.             int k = i;  
  28.             /*boolean isHeap = false;*/  
  29.             while(/*!isHeap && */leftChildIdx(k) <= lastIdx) {  
  30.                 int j = leftChildIdx(k);  
  31.                 if(j < lastIdx) {    //有两个孩子  
  32.                     if(datas[j] <= datas[j+1]) { //j+1 比较大, 选择大的  
  33.                         j++;  
  34.                     }  
  35.                 }  
  36.   
  37.                 if(datas[k] > datas[j]) {    //父的比较大  
  38.                     /*isHeap = true;*/  
  39.                     break;  
  40.                 } else {  
  41.                     SortUtil.swap(datas, k, j);  
  42.                     k = j;  
  43.                 }  
  44.             }  
  45.         }  
  46.     }  
  47.   
  48.     /** 
  49.      * 堆顶改变, 要维护大顶堆. 
  50.      * @author chenlb 2008-12-28 下午03:53:04 
  51.      */  
  52.     private static void maintainMaxHeap(int[] datas, int lastIdx) {  
  53.         int k = 0;  
  54.         while(k <= parentIdx(lastIdx)) {  
  55.             int j = leftChildIdx(k);  
  56.             if(j < lastIdx) {    //有两个孩子  
  57.                 if(datas[j] <= datas[j+1]) { //j+1 比较大, 选择大的  
  58.                     j++;  
  59.                 }  
  60.             }  
  61.             if(datas[k] < datas[j]) {    //父结点比较小  
  62.                 SortUtil.swap(datas, k, j);  
  63.                 k = j;  
  64.             } else {  
  65.                 break;  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     public static int[] sort(int[] datas) {  
  71.         buildMaxHeap(datas);  
  72.         int lastIdx = datas.length - 1;  
  73.         while(lastIdx > 0) {  
  74.             SortUtil.swap(datas, 0, lastIdx);  
  75.             lastIdx--;  
  76.             if(lastIdx > 0) {  
  77.                 maintainMaxHeap(datas, lastIdx);  
  78.             }  
  79.         }  
  80.         return datas;  
  81.     }  
  82.   
  83.     public static void main(String[] args) {  
  84.         int[] datas = {5,1,3,4,9,2,7,6,5};//{2, 9, 3, 7, 8, 6, 4, 5, 0, 1};  
  85.   
  86.         /*buildMaxHeap(datas); 
  87.         System.out.println(Arrays.toString(datas));*/  
  88.   
  89.         sort(datas);  
  90.         System.out.println(Arrays.toString(datas));  
  91.   
  92.         datas = SortUtil.randomDates(10);  
  93.         sort(datas);  
  94.         System.out.println(Arrays.toString(datas));  
  95.   
  96.     }  
  97.   
  98. }  

运行结果:

  1. [1, 2, 3, 4, 5, 5, 6, 7, 9]  
  2. [18, 185, 239, 304, 407, 489, 546, 688, 744, 821]  

待排序数据:5, 1, 3, 4, 9, 2, 7, 6, 5
构建大顶堆的过程:
5, 1, 3, 4, 9, 2, 7, 6, 5
5, 1, 3, 6, 9, 2, 7, 4, 5
5, 1, 7, 6, 9, 2, 3, 4, 5
59, 7, 6, 1, 2, 3, 4, 5
9, 5, 7, 6, 1, 2, 3, 4, 5 -> 9, 6, 7, 5, 1, 2, 3, 4, 5

排序过程:
9, 6, 7, 5, 1, 2, 3, 4, 5
7, 6, 5, 5, 1, 2, 3, 49
6, 5, 5, 4, 1, 2, 37, 9
5, 5, 3, 4, 1, 26, 7, 9
5, 4, 3, 2, 15, 6, 7, 9
4, 2, 3, 15, 5, 6, 7, 9
3, 2, 14, 5, 5, 6, 7, 9
213, 4, 5, 5, 6, 7, 9
1, 2, 3, 4, 5, 5, 6, 7, 9

红色为交换。

 

分享到:
评论

相关推荐

    常用的十种java排序算法实现

    1. 冒泡排序(Bubble Sort) ...6.堆排序(Heap Sort) 7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort) 解压密码 douge

    排序算法-SortingAlgorithm-java.zip

    堆排序 1.选择排序 Selection Sort 2.冒泡排序 Bubble Sort 3.插入排序 Insertion Sort 4.归并排序 Merge Sort 5.快速排序 Quick Sort 6.堆排序 Heap Sort 7.总结 summary

    堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法

    堆排序 堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法

    常用的8个Python排序算法

    1. 冒泡排序(Bubble Sort) def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): ...7. 堆排序(Heap Sort) 8. 计数排序(Counting Sort) 解压密码 douge

    堆排序算法详解与实现.zip

    堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即父节点的键值总是大于或等于(最大堆)或小于或等于(最小堆)其子节点的键值。在本文...

    堆排序——heap-sort

    void heap_sort(int A[],int length) { BUILD_MAX_HEAP(A,length); int i,middle; for(i=length-1;i&gt;0;i--) { middle=A[0]; A[0]=A[i]; A[i]=middle; heap_size--; MAX_HEAPIFY(A,0); } }

    test_heap_sort.rar_heap

    标题中的“test_heap_sort.rar_heap”表明这是一个关于堆排序(Heap Sort)的程序实现,使用了VC++(Visual C++)编程语言。堆排序是一种基于比较的排序算法,它的核心思想是利用二叉堆的数据结构来对数组进行排序。...

    堆排序(c++实现).

    C++中实现堆排序,可以使用标准库中的`&lt;algorithm&gt;`头文件中的`make_heap`、`push_heap`、`pop_heap`和`sort_heap`等函数,但为了更直观地理解,我们可以自定义函数来实现整个过程。 以下是一个基本的C++代码示例:...

    C#写的堆排序算法(heap sort)

    堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在C#中实现堆排序,我们可以分为两个主要步骤:建堆和调整堆。这里,我们将深入探讨堆排序的基本原理、C#实现的细节以及其在实际应用中的...

    java十大排序算法实现

    java十大排序算法实现 1. 冒泡排序(Bubble Sort) 2. 选择排序(Selection ...6. 堆排序(Heap Sort) 7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort)

    堆排序 java实现

    堆排序算法的java实现,采用大根堆。时间复杂度为O(nlogn).

    Java排序算法 Java排序算法.rar

    7. **堆排序(Heap Sort)** 堆排序使用堆这种数据结构,将待排序序列构造成一个大顶堆(或小顶堆),此时整个序列的最大值就是堆顶的根节点。然后将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素...

    堆排序算法源代码

    堆排序的核心思想是利用树形数据结构——堆(Heap)来完成排序。堆是一个近似完全二叉树的结构,同时满足大顶堆(父节点的值大于或等于其子节点的值)或小顶堆(父节点的值小于或等于其子节点的值)的性质。在堆排序...

    堆排序之Java实现

    以下是Java实现堆排序的基本步骤: 1. 构建大顶堆:从最后一个非叶子节点(即最后一个元素的父节点)开始,自底向上、自右向左进行调整,确保每个节点都大于或等于其子节点。 2. 交换堆顶元素与末尾元素:将最大...

    java版冒泡排序,插入排序,堆排序,快速排序,归并排序,希尔排序,桶排序

    3. **堆排序(Heap Sort)**: 堆排序利用了二叉堆的特性,将待排序的序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,再调整剩余元素成为新的堆,如此反复。Java中可以使用`PriorityQueue`类实现堆...

    堆排序C语言和java语言

    在本文中,我们将深入探讨堆排序的概念、工作原理,并分别以C语言和Java语言来实现这一算法。 堆排序的核心思想是利用二叉堆的特性进行排序。二叉堆分为大顶堆和小顶堆,大顶堆中每个节点的值都大于或等于其子节点...

    最大堆MaxHeap排序 C++代码

    最大堆排序(MaxHeap Sort)是一种基于比较的排序算法,它利用了数据结构中的最大堆特性来实现排序。最大堆是一种特殊的二叉堆,每个父节点的值都大于或等于其子节点的值,通常以数组的形式存储。下面将详细介绍最大...

    基数排序、堆排序、希尔排序、直接插入排序

    在`堆排序Heap_sort.cpp`中,你可以学习到如何维护堆的性质并进行相应的调整,如 sift-up 和 sift-down 操作,以实现排序。 希尔排序,又称缩小增量排序,是插入排序的一种更高效的改进版本。它通过将待排序的元素...

    Java ArrayList实现的快排,归并排序,堆排序

    本篇将重点讲解如何利用ArrayList实现快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)这三种经典的排序算法,并探讨它们的原理、优缺点以及在实际应用中的选择。 **快速排序(Quick Sort)**...

    堆排序(C++源码)

    用C++实现的 堆排序,包括恢复堆,构建初始堆

Global site tag (gtag.js) - Google Analytics