关闭

java实现 堆排序

标签: java堆排序二叉树
14701人阅读 评论(2) 收藏 举报
分类:

在实现堆排序之前 我们先来介绍一下什么是最大堆与最小堆

最大堆 与最小堆 都是一个二叉树 也称为二叉堆

二叉堆的定义
每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)

最大堆 : 当父节点的键值总是大于或等于每一个子节点 时被称为最大堆

最小堆 : 当父节点的键值总是小于或等于每一个子节点 时被称为最小堆

最小堆 :

                   1

             2            3

       17        19     36    7 

    25   100        

最大堆:

                100

            98         97

         67    63

       45   23

一般的堆的存储都用数组来完成 ,所以一个节点的父节点就为 (节点下标-1)/2 他的左右子节点分别为2*i+1 和 2*i+2

例子 :

            10

       15        56

    23   75                                             array[]={10.15,56.23.75};      

15的父节点就为 (1-1)/2 =0 左右子节点为 array[2*1+1]=23 array[2*1+2]=75

我们已经理解了什么是最大堆 与最小堆了,现在我们来编写代码


/*
 * *功能  快速排序
 * *作者 blue
 * *data 4.5
 * 
 */
public class MaxHeapsortDemo {
    private static int[] sort = new int[]{1,0,10,10,3,5,6,4,9,8,12,17,34,11};

    public static void main(String[] args) {
        builddMaxHeapify(sort);
        heapSort(sort);
        Prtint(sort);
    }
    private static void Prtint(int[] sort2) {
        for (int i = 0; i < sort2.length; i++) {
            System.out.print(" "+sort2[i]);
        }

    }
    private static void builddMaxHeapify(int[] data) {
        int startIndex = (data.length-2)>>1;//得到数组最后一位的父节点
        for (int i = startIndex; i>=0; i--) {
            maxHeap(data, data.length, i);

        }
    }
    private static void maxHeap(int[] data ,int heapSize,int index) {
        int leftChildIndex = (index<<1)+1;//得到该节点的左子节点
        int rightChildIndex = (index<<1)+2;//得到该节点的右子节点
        int largest =index;
        /*
         * 找到当前节点与左右节点的的最大值
         */
        if (leftChildIndex<heapSize&&data[index]<data[leftChildIndex]) {
            largest = leftChildIndex;
        }
        if (rightChildIndex<heapSize&&data[largest]<data[rightChildIndex]) {
            largest = rightChildIndex;

        }
        /*
         * 如果当前的父节点不是最大点,就交换节点与最大节点的值,
         */
        if (largest!=index) {
            int temp = data[index];
            data[index] =data[largest];
            data[largest] =temp;
            maxHeap(data, heapSize, largest);

        }
    }
    /*
     * *从第一父节点开始交换,把第一父节点交换给最后一个节点,然后再调用MaxHeap 从新排最大堆
     */

    private static void heapSort(int[] data) {

        for (int i = data.length-1; i >=0; i--) {
            int temp = data[0];
            data[0]=data[i];
            data[i]=temp;
            maxHeap(data, i, 0);
        }

    }



}

我们首先 将一个乱序的数组 排成了一个最大堆 ,
首先 找到一个父节点 ,然后找到左右子节点,判断三个节点的键值的最大,如果父节点不是最大就要与最大的子节点交换,交换 之后的子节点已经不满足最大堆 ,所以这个时候我们就需要递归来继续重排最大堆

意思就是 刚开始是 56|67 23 发现 56不是最大节点 然后把 67 和 56 换掉 这个时候 原先67的左右子节点就不满足56 了 所以就要重新构成最大堆

在构成最大堆后 ,我们就开始排序了

首先这个最大堆得最大父节点 与最后一位交换,交换之后 就又不满足最大堆的特性,所以这时候我们又要重新调用maxHeap 函数 来重新构成最大堆了
这个时候我们发现,最大父节点已经是上一个父节点的左子节点
如图所示 :

END!

9
0
查看评论

【排序算法】堆排序原理及Java实现

1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。 堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-27 18:34
  • 8253

HeapSort堆排序Java实现图文代码详解

堆排序(Heapsort)堆积树设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。 排序图如下:(gif来自维基百科) 堆排序的过程就是首先构建大根堆,然后对顶元素(及最大元素)与最后个元素替换位置,heapsize减一,重新调整堆变成大根堆。重复上面操作直到heapsize等于一...
  • wg1033755123
  • wg1033755123
  • 2015-04-12 14:04
  • 769

堆排序(Heapsort)之Java实现

堆排序算法介绍 堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如果有右子树,右子树的位置是2i+2,如果有父节点,父节点的位置是(n-1)/2取整。分为最大堆和最小...
  • kimylrong
  • kimylrong
  • 2013-12-05 22:25
  • 53287

基本算法_堆排序_Java实现

堆排序就是将序列调整为指定的堆,然后调整首尾元素的位置,取出末尾元素,反复进行,直到将所有元素取出,形成一个有序的序列。
  • ljmingcom304
  • ljmingcom304
  • 2015-12-22 14:14
  • 2000

【java面试】算法篇之堆排序

一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大于等于其左、右孩子的值,这样的堆称为大根堆; 二、要点 1.将数组构造成初始堆(若想升序则建立...
  • qq_21492635
  • qq_21492635
  • 2017-06-12 14:23
  • 513

算法(第四版)学习笔记之java实现堆排序

继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序。 堆排序可分为两个阶段: 1.构建堆:在堆的构建过程中,我们将原始数组重新组织安排进一个堆中; 2.下沉排序:从堆中按递减顺序取出所有元素并得到排序结果...
  • l243225530
  • l243225530
  • 2015-07-26 16:02
  • 1047

《排序算法》——堆排序(大顶堆,小顶堆,Java)

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

java堆排序递归代码,无原理版,比较好理解

public class HeapOperate2 { /* * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求 */ public static void main(String[] args) { int[] a = { 9, 8, 7, 6...
  • zhuqiuhui
  • zhuqiuhui
  • 2016-04-21 23:29
  • 1216

java堆排序非递归代码,无原理版,比较好理解

public class HeapOperate { /* * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求 */ public static void main(String[] args) { //数组0下标元素作为暂存单元 int d...
  • zhuqiuhui
  • zhuqiuhui
  • 2016-04-21 23:01
  • 815

堆排序算法及其Java实现(以大根堆为例)

(二叉)堆数据结构是一种数组对象,如图所示(下标从0开始),它完全可以被视为一棵完全二叉树。 接下来要出现的几个词语,这里介绍一下: length[A]: 数组A中元素的个数 heap-size[A]: 存放在数组A中堆的元素的个数,是要排序的元素的个数,在进行堆排序时,这个是会变的(减1...
  • qq_35178267
  • qq_35178267
  • 2017-10-22 21:11
  • 291
    个人资料
    • 访问:112488次
    • 积分:1389
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论