`
128kj
  • 浏览: 604096 次
  • 来自: ...
社区版块
存档分类
最新评论

容易理解的堆排序代码(JAVA)

 
阅读更多




import java.util.Scanner;  
 
public class Heap {  
  
    private int[] data;  
  
    /*输入数组元素,数组下标从1开始*/  
    public void input() {  
        System.out.println("请输入数组大小");  
        Scanner scanner = new Scanner(System.in);  
        int n = scanner.nextInt();  
        data = new int[n + 1];  
        System.out.println("输入数组元素");  
        for (int i = 1; i <= data.length-1; i++) {  
            data[i] = scanner.nextInt();  
        }  
        System.out.println("输入完成");  
    }  
      
   //测试数据:
   //第一组:1 7 9 3 10 16 4 14 2 8
  //第二组:17 8 84 2 45 94
   //第三组:10 32 1 9 5 7 12 0 4
   public static void main(String args[]){
          Heap h=new Heap();
               h.input();
           System.out.println("堆排序前:");
               h.print();
               h.heapSort();
          System.out.println("堆排序后:");
              h.print();
  }


    /** 
     * 调整堆,使其满足堆得定义 
     * @param i 
     * @param n 
     */  
    public void adjust(int i, int n) {  
        
        int child;  
        for (; i <= n / 2; ) {  
            child = i * 2;  
           // System.out.println("child="+child);
            if(child+1<=n&&data[child]<data[child+1])  
                child+=1;/*使child指向值较大的孩子*/  
            if(data[i]<data[child]){  
                swap(i, child);  
                /*交换后,以child为根的子树不一定满足堆定义,所以从child处开始调整*/  
                i = child;  
               
            }  else break;
        }  
    }  
  
    public void heapSort() {  
        /*根据树的性质建堆,树节点前一半一定是分支节点,所以我们从这里开始调整出初始堆*/  
        for (int i = data.length / 2; i > 0; i--)  
            adjust(i, data.length-1);  

        System.out.println("调整后的初始堆:");
            print();
        for (int i = data.length-1; i > 0; i--) {  
            /*把根节点跟最后一个元素交换位置,调整剩下的n-1个节点,即可排好序*/  
            swap(1, i);  
            adjust(1, i - 1);  
        }  
    }  
  
    public void swap(int i, int j) {  
        int temp = data[i];  
        data[i] = data[j];  
        data[j] = temp;  
    }  
  
    public void print() {  
        for (int i = 1; i < data.length; i++) {  
            System.out.print(data[i]+" ");  
        }  
        System.out.println();  
    }  
  
}  


运行:
请输入数组大小
10
输入数组元素
1 7 9 3 10 16 4 14 2 8
输入完成
堆排序前:
1 7 9 3 10 16 4 14 2 8
调整后的初始堆:
16 14 9 7 10 1 4 3 2 8
堆排序后:
1 2 3 4 7 8 9 10 14 16

下载源码:
  • 大小: 30 KB
  • 大小: 23.6 KB
  • 大小: 71.7 KB
  • 大小: 14.8 KB
分享到:
评论

相关推荐

    堆排序之Java实现

    在实际应用中,Java的`PriorityQueue`可以提供更简洁的实现方式,但手动实现有助于理解堆排序的工作原理。 总结起来,堆排序是一种高效的排序算法,时间复杂度为O(n log n),空间复杂度为O(1)。在Java中,我们可以...

    堆排序JAVA实现代码

    堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在Java中,我们可以利用数组来表示堆,因为数组...结合博客的详细解释,读者可以更深入地理解堆排序的工作机制,并通过实践代码加深印象。

    [Java算法-排序]-堆排序.java

    该资源包括实用练习,让读者可以练习在Java中实现堆排序,并提供解决方案以帮助读者检查自己的工作并深入理解所学内容。 无论您是Java编程的初学者还是有经验的程序员,该资源都将为您提供有价值的指导和支持,帮助...

    堆排序代码

    ### 堆排序原理与实现 #### 一、堆排序简介 堆排序是一种基于比较的排序算法,利用了堆的数据结构。它将待排序数组构造成一个大顶堆(或小顶堆...通过上述代码实现,可以有效地理解和掌握堆排序的工作原理及实现细节。

    java堆排序

    #### 堆排序代码分析 提供的代码中定义了一个名为`HeapSort`的类,该类包含了主要的堆排序逻辑。`Sort`方法实现了堆排序的整体流程,`Adjust`方法负责维护最大堆的性质,`Display`方法用于输出数组状态。 #### 其他...

    各种排序代码的JAVA实现

    本文将深入探讨在JAVA中实现的各种排序算法,包括堆排序、归并排序、快速排序、基数排序、选择排序、冒泡排序、插入排序、希尔排序、计数排序和桶排序。 1. **堆排序**:堆排序是一种基于比较的排序算法,它利用了...

    java实现的shell排序快速排序归并排序堆排序

    本篇将详细介绍标题所提及的四种排序算法:Shell排序、快速排序、归并排序以及堆排序。 1. **Shell排序**: Shell排序是一种改进的插入排序,由Donald Shell于1959年提出。它通过设置一个间隔序列,使得数组中的...

    选择排序java 代码

    选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出...在实际编程中,我们通常会使用更高效的排序算法,如快速排序、归并排序或堆排序,但理解基础排序算法对提升编程技能仍然非常重要。

    java实现堆排序以及示例代码

    在Java中,我们可以使用以下步骤来实现堆排序: 1. **理解堆的概念**:堆是一个近似完全二叉树的结构,同时满足堆的性质,即每个节点的值都大于或等于其子节点的值(称为大顶堆,用于升序排列),或者小于或等于其...

    Java各种排序算法代码.zip

    Java的PriorityQueue类可以用来实现堆排序的一部分功能。 7. 计数排序(Counting Sort)、桶排序(Bucket Sort)和基数排序(Radix Sort): 这些排序算法适用于特定类型的数据,例如非负整数。计数排序统计每个...

    各种排序的java代码归总

    在编程领域,排序算法是数据结构与算法学习中的基础且重要的部分。Java作为一种广泛应用的编程语言,其在...在学习过程中,通过阅读和实践提供的Java代码,可以更直观地理解每种排序算法的工作原理及其在Java中的实现。

    Java实现堆排序.rar

    通过这个文件,你可以学习到如何将理论上的堆排序算法转化为实际的Java代码,并理解每一步是如何工作的。 总的来说,堆排序算法具有O(n log n)的时间复杂度,对于大数据集来说是相当高效的。同时,由于其原地排序的...

    各种排序Java代码

    以下将详细讲解标题“各种排序Java代码”中涉及的几种排序方法,包括快速排序、冒泡排序、堆排序和归并排序。 1. **快速排序(Quick Sort)**: 快速排序是一种基于分治思想的高效排序算法,由C.A.R. Hoare在1960...

    Java各种排序算法代码.

    本资源包含的是Java实现的各种常见排序算法的代码示例,每个算法都有详细的注释,方便初学者理解和学习。 1. **冒泡排序**:这是一种基础的排序算法,通过不断交换相邻的逆序元素来逐渐把较大的元素推向数组的后部...

    堆排序算法原理与Java实现详解

    首先介绍堆作为近似完全二叉树的特性及满足堆积性质的要求,随后给出堆排序的具体步骤,最后提供了完整的Java代码示例来实现这一算法。 适合人群:有一定编程经验的开发者,特别是对排序算法有兴趣的学习者。 使用...

    Java各种排序算法代码

    了解和掌握这些排序算法的原理和实现方式,不仅有助于编写高效的排序代码,还能帮助我们在面对实际问题时选择最合适的解决方案。在学习过程中,可以结合实际例子,通过编写代码来加深理解,同时通过分析时间复杂度和...

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

    在编程领域,排序算法是数据结构与算法学习中的基础部分,它们用于整理无序的数据序列。以下是关于Java实现的七种排序算法的详细...在Java编程中,理解这些排序算法的实现和性能特点,有助于写出高效、适应性强的代码。

    Java实现堆排序

    在Java中实现堆排序,我们需要理解堆的数据结构以及如何维护堆的性质。接下来,我们将深入探讨这个话题。 堆是一个近似完全二叉树的结构,并且满足堆的性质:即父节点的值总是大于或等于(最大堆)或小于或等于...

    最新最全的排序方法 Java 源代码

    5. **Heap Sort(堆排序)**:堆排序利用了二叉堆的数据结构,将待排序序列构造成一个大顶堆或小顶堆,然后通过交换堆顶元素与末尾元素实现排序。Java中的Heap Sort适用于处理大数据量,且时间复杂度为O(n log n)。 ...

Global site tag (gtag.js) - Google Analytics