java 堆排序

package wangChaoPA实习工作练习.com.进阶篇.排序;
import java.util.ArrayList;

/**
 *
 * <p>
 * 描述该类情况 {@link 代表跟谁有关系}
 * </p>
 *
 * @author 王超
 * @since 1.0
 * @date 2017年5月10日 下午5:44:42
 * @see 新建|修改|放弃
 * @see wangChaoPA实习工作练习.com.进阶篇.排序.Heap
 */

public class Heap<E extends Comparable>
{
    private ArrayList<E> list = new ArrayList<E>();// 使用ArrayList实现堆排序

public Heap()
    {
    }

public Heap(E[] objects)
    {
        for (int i = 0; i < objects.length; i++)
        {
            add(objects[i]);
        }
    }

// 添加
    public void add(E newObject)
    {
        // 添加到list
        this.list.add(newObject);
        // 获取到添加到list中newObject的索引值
        int currentIndex = this.list.size() - 1;
        while (currentIndex > 0)
        {
            // 获取到父节点的索引
            int parentIndex = (currentIndex) / 2;
            // 如果新增元素的值大于父节点的值则进行swap
            if (list.get(currentIndex).compareTo(list.get(parentIndex)) > 0)
            {
                E temp = this.list.get(currentIndex);
                this.list.set(currentIndex, this.list.get(parentIndex));
                this.list.set(parentIndex, temp);
            }
            else
            {
                break;
            }
            currentIndex = parentIndex;
        }
    }

// 堆的大小
    public int getSize()
    {
        return this.list.size();
    }

// 删除
    public E remove()
    {
        if (this.list.size() == 0)
        {
            return null;
        }
        // 首元素 即最大的元素
        E removeObject = this.list.get(0);
        // 把最后的一个元素置于第一个
        this.list.set(0, this.list.get(this.list.size() - 1));
        // 删除最后一个元素
        this.list.remove(this.list.size() - 1);
        int currentIndex = 0;
        while (currentIndex < this.list.size())
        {
            // 获取到新首元素的子节点索引
            int leftChildIndex = currentIndex * 2 + 1;
            int rightChildIndex = currentIndex * 2 + 2;
            if (leftChildIndex >= this.list.size())
            {
                break;
            }
            // 获取子节点中大的索引值
            int maxIndex = leftChildIndex;
            if (rightChildIndex < this.list.size())
            {
                if (this.list.get(maxIndex)
                        .compareTo(this.list.get(rightChildIndex)) < 0)
                {
                    maxIndex = rightChildIndex;
                }
            }
            // 比较父节点与子节点 并交换
            if (this.list.get(currentIndex)
                    .compareTo(this.list.get(maxIndex)) < 0)
            {
                E temp = this.list.get(maxIndex);
                this.list.set(maxIndex, this.list.get(currentIndex));
                this.list.set(currentIndex, temp);
                currentIndex = maxIndex;
            }
            else
            {
                break;
            }
        }
        return removeObject;
    }
}

//测试类
package wangChaoPA实习工作练习.com.进阶篇.排序;
public class HeapSort
{
    public static <E extends Comparable> void heapSort(E[] list)
    {
        Heap<E> heap = new Heap<E>();
        for (int i = 0; i < list.length; i++)
        {
            heap.add(list[i]);
        }
        for (int i = list.length - 1; i >= 0; i--)
        {
            list[i] = heap.remove();
        }
    }

public static void main(String[] args)
    {
        Integer[] list =
        { 2, 3, 2, 5, 6, 1, -2, 3, 14, 12 };
        heapSort(list);
        for (Integer temp : list)
        {
            System.out.print(temp + " ");
        }
    }
}

时间: 2024-12-06 14:13:14

java 堆排序的相关文章

Java堆排序,取得前TopN个数

import java.util.Random; /** * Created with IntelliJ IDEA. * User: pengfei.hpf * Date: 14-4-29 * Time: 上午11:45 * To change this template use File | Settings | File Templates. */ public class HeapSortUtil { /** * 用堆排序方法 找出前N个最大的数 * @originalArray 原始数据

java堆排序实现

代码如下: public class HeapSort { public static void heapSort(DataWrap[] data) { System.out.println("开始排序"); int length = data.length; //循环建堆 for(int i = 0;i < length-1; i++) { //建堆 buiilMaxdHeap(data , length-1-i); //交换堆订和最后一个元素 swap(data , 0, l

java 堆排序代码(最小堆)

package com.juxuny.heap; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; /** * Created by Juxuny on 2015/2/10. */ public class Heap { private int MAX = 2 << 20; private Node[] arr; private int size = 0; public Heap

java &nbsp; 堆排序 实现

堆排序啊,其实是一种数据结构,二叉树,二叉树分为是满二叉树和完全二叉树.一棵深度为 k,且有 2k - 1 个节点称之为满二叉树,完全二叉树:深度为 k,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 k 的满二叉树中序号为 1 至 n 的节点对应时,称之为完全二叉树. 话收回来,堆呢,有最大堆,最小堆,最大堆是子节点没有比父节点小的,最小堆则相反.下面是堆排序,可以自己画一个草图自己画画,堆排序的过程. package com.test1; //堆排序 public class Hea

java 堆排序的实现

堆就是一个完全二叉树,堆要求是指 该节点大于它的两个子节点.而两个字节点大小不一定. 堆排序的最坏时间复杂度为nlog(n),平均也为nlog(n),占用空间为o(1),是一种比较排序算法. 堆排序也可以用于找最大的k个数.时间复杂度为klog(n),因为建堆后,每次循环实际上都生成一个最大数. 下面见代码: //从小到大排序 public class HeapSort { private int[] A; private int heapSize; //构造函数,传入待排序数组 public

9 Java 堆排序

堆是具有以下性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如下图: 同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子: 该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是: 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] &&

Hark的数据结构与算法练习之堆排序

前言 堆排序我是看了好半天别人的博客才有了理解,然后又费了九牛二虎之力才把代码写出来,我发现我的基础真的很差劲啊……不过自己选的路一定要坚持走下去.我试着把我的理解描述出来,如有不妥之处希望大家可以指点出来 算法说明 堆排序,是基于堆的排序. 堆也就是二叉树的一种(完全二叉树),首先要确定堆的定义,才可以学会堆算法的逻辑: OK,我们知道堆的定义前得先确定啥是完全二叉树. 二叉树就是树状结构是这样的,如图: 通常二叉树都会存放在数组中,那么将上图的完全二叉树放在数组中就是int[] arrayD

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

Java 实现堆排序

堆 堆排序和合并排序一样,是一种时间复杂度为O(nlgn)的算法,同时和插入排序一样,是一种就地排序算法(不需要额外的存储空间).堆排序需要用到一种被称为最大堆的数据结构,与java或者lisp的gc不一样,这里的堆是一种数据结构,他可以被视为一种完全二叉树,即树里面除了最后一层其他层都是填满的.也正是因为这样,树里面每个节点的子女和双亲节点的序号都可以根据当前节点的序号直接求出. Parent(i)=i/2 Left(i)=2*i Right(i)=2*i+1 如上图所示,1位置的子女节点分别