`
annan211
  • 浏览: 460292 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 堆排序

 
阅读更多

堆的定义如下:
  n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。
  " ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"
  若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,

  则完全二叉树中每一个节点的值的都大于或等于任意一个字节的值(如果有的话),称之为大顶堆。

  则完全二叉树中每一个节点的值的都小于或等于任意一个字节的值(如果有的话),称之为小顶堆。

  由此,若序列{k0,k1,…,k(n-1)}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。

  倘若给堆中每一个节点都赋予一个整数值标签,根节点被标记为0,对于每一个标记为i的节点,其左子节点(若存在的话)被标记为2*i+1,其右子节点(若存在的话)被标记为2*i+2,对于一个标记为i的非根节点,其父节点被标记为(i-1)/2。使用这个标记,我们能够将堆存储在数组中,节点存储在数据中的位置就使其标签。


排序包含两个过程:

(1)初建堆

(2)调整堆



调整堆:对于第二个过程,描述如下,第一次,取出堆顶元素与R[n]进行交换,然后从根结点开始调整堆,根结点与左右孩子中较大者交换,这样,左右子树的堆会被破坏,继续进行上述操作,直到叶子结点为止。第二次,取出堆顶元素与R[n-1]交换,然后调整堆。

初建堆:从非终端结点开始一直到根结点,执行调整堆的过程。这样,就会建立一个大顶堆。

堆的调整 实际上简单理解就是 确保是一颗完全二叉树,即所有的父节点必须大于等于左右孩子。

堆调整之后,再进行堆排序。

如 数组 [2 7 3 5 6 9] 二叉树为

        2
    7    3

  5  6  9

9 是大于 父节点 3 的,所以需要调整

堆排序算法的JAVA实现:

/**
* 堆排序包括两个步骤 (1)初始堆(堆的定义:(1)堆是一个完全二叉树(2)根结点的值或者大于左右子树的值或者小于左右子树的值(3)左右子树也是一个堆)
* (2)调整堆(当初始小顶堆之后,堆顶元素是最小的元素,取出最小的元素与最后一个元素相交换,再把剩下n-1个元素调整成堆,依次调整直到1为止)
* 非终端节点调整 初始堆时从n/2向上调整成堆 把第一个元素与最后一个元素交换之后从第1个元素开始调整成新堆
*




package collections;

public class HeapSorter {
    public static void heapSort(int[] array){
        buildHeap(array);//构建堆
        int n = array.length;
        int i=0;
        for(i=n-1;i>=1;i--){
            swap(array,0,i);
            heapify(array,0,i);
         }
    }

    public static void buildHeap(int[] array){
        int n = array.length;//数组中元素的个数
        for(int i=n/2-1;i>=0;i--)
            heapify(array,i,n);

    }
    public static void heapify(int[] A,int idx,int max){
        int left = 2*idx+1;// 左孩子的下标(如果存在的话)
        int right =2*idx+2;// 左孩子的下标(如果存在的话)
        int largest = 0;//寻找3个节点中最大值节点的下标
        if(left<max && A[left]>A[idx])
            largest = left;
        else
            largest = idx;
        if(right<max && A[right]>A[largest])
            largest = right;
        if(largest!=idx){
            swap(A,largest,idx);
            heapify(A,largest,max);
          }
    }
    public static void swap(int[] array,int i,int j){
        int temp =0;
        temp=array[i];
        array[i]=array[j];
        array[j]=temp;
    }

    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,16,9,10,11,12,13,14,15,8};
        System.out.println("排序前..........................");
        for(int i=0;i<a.length;i++)
            System.out.print(a[i]+" ");

        System.out.println();
        heapSort(a);

        System.out.println("排序后..........................");
        for(int i=0;i<a.length;i++)
            System.out.print(a[i]+" ");
    }

}

分享到:
评论

相关推荐

    java堆排序

    根据提供的信息,我们可以深入探讨Java中的堆排序以及几种常见的排序算法。这包括堆排序、快速排序、冒泡排序和选择排序等。 ### 堆排序 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构。二叉堆可以是...

    java堆排序和几种排序方法实现代码文.pdf

    Java堆排序是一种基于比较的排序算法,其核心思想是构建一个大顶堆或小顶堆,然后通过调整堆结构来达到排序的目的。在给定的代码中,`HeapSort` 类实现了堆排序的过程。 1. **堆排序流程**: - 首先,将待排序的数...

    java堆排序原理及算法实现

    【Java堆排序原理】 堆排序是一种高效的排序算法,基于完全二叉树的堆数据结构。在Java中,堆排序能够实现原地排序,即不需要额外的存储空间,且时间复杂度为O(nlogn)。然而,由于它不是稳定的排序算法,相同元素的...

    Java实现堆排序

    Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C

    Java 最大堆排序

    Java 写得最大堆排序代码,给大家参考下,自己刚写的。

    java堆排序原理与实现方法分析

    "java堆排序原理与实现方法分析" Java 堆排序是一种基于完全二叉树的排序算法,它可以将数组中的元素排序为递增或递减的顺序。下面将详细介绍 Java 堆排序的原理与实现方法。 堆排序原理 堆是一个数组,被看成一...

    堆排序7.java 使用java实现的堆排序

    堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆...

    Java实现堆排序.rar

    以下是一个简单的Java堆排序算法实现的伪代码: ```java class HeapSort { void heapify(int arr[], int n, int i) { // 代码实现下沉操作 } void swap(int arr[], int i, int j) { // 代码实现元素交换 } ...

    堆排序的非递归算法分析与JAVA实现

    在JAVA中,堆排序可以通过递归或非递归方式实现。非递归方式通常需要借助循环结构来模拟递归过程。由于堆排序的非递归实现比递归实现更为复杂,需要我们手动控制循环的迭代次数和条件,因此在理解堆排序算法的逻辑时...

    Java堆排序算法详解

    "Java堆排序算法详解" Java堆排序算法是将原始数据转换为堆的形式,然后重复地删除堆顶元素,并将其插入到有序的序列中,以达到排序的目的。下面是Java堆排序算法的知识点总结: 1. heap的概念:堆是一种特殊的...

    java堆排序概念原理介绍

    "java堆排序概念原理介绍" java堆排序是一种基于比较的排序算法,它通过构建一个堆来实现排序。下面是关于java堆排序概念原理的详细介绍: 什么是堆排序 堆排序是一种基于比较的排序算法,它通过构建一个堆来实现...

    java堆排序和几种排序方法实现代码.pdf

    Java中的堆排序是一种基于比较的排序算法,它利用了数据结构——堆的特性来实现排序。堆是一个近似完全二叉树的结构,并且满足堆的性质:即父节点的键值总是大于或等于(或者小于或等于)其子节点的键值。在这个例子...

    堆排序12.java 使用java代码实现

    堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用...

    堆排序10.java 使用java来实现

    堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆...

    堆排序 java实现

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

    JAVA堆排序算法的讲解

    "JAVA堆排序算法的讲解" JAVA堆排序算法是基于堆数据结构的一种选择排序算法,它的最坏、最好、平均时间复杂度均为O(nlogn),是一种不稳定排序。堆排序的基本思想是将待排序序列构造成一个大顶堆,此时,整个序列...

    堆排序算法(java)

    java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。

    堆排序算法 java

    堆排序算法 java

    Java 堆排序实例(大顶堆、小顶堆)

    Java 堆排序实例(大顶堆、小顶堆) 在计算机科学中,堆排序是一种基于堆这种数据结构的排序算法。堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆...

    堆排序之Java实现

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

Global site tag (gtag.js) - Google Analytics