堆排序简单实现


import java.util.Arrays;

public class HeapSort {
    /**
     * 找到数组中下标为i的元素的父节点在数组中所在的下标位置
     *
     * @param i
     *            要操作的元素下标
     * @return 下标为i的元素的父节点在数组中所在的下标位置
     */
    static int parent(int i) {
        return ((i + 1) >> 1) - 1;
    }

    /**
     * 找到数组中下标为i的元素的左孩子节点在数组中所在的下标位置
     *
     * @param i
     *            要操作的元素下标
     * @return 下标为i的元素的左孩子节点在数组中所在的下标位置
     */
    static int left(int i) {
        return right(i) - 1;
    }

    /**
     * 找到数组中下标为i的元素的右孩子节点在数组中所在的下标位置
     *
     * @param i
     *            要操作的元素下标
     * @return 下标为i的元素的右孩子节点在数组中所在的下标位置
     */
    static int right(int i) {
        return (i + 1) << 1;
    }

    static void swap(int array[], int first, int second) {
        int temp = array[first];
        array[first] = array[second];
        array[second] = temp;
    }

    /**
     * 将数组array中的以root为起点连续size+1个元素调整为大顶堆,但前提是root的左右两棵子树都是大顶堆
     *
     * @param array
     * @param root
     * @param size
     */
    static void selectMax(int array[], int root, int size) {
        int largest = root;
        int left = left(root);
        int right = right(root);
        if (left <= size && array[left] > array[largest]) {
            largest = left;
        }
        if (right <= size && array[right] > array[largest]) {
            largest = right;
        }
        if (largest != root) {
            swap(array, largest, root);
            selectMax(array, largest, size);
        }
    }

    /**
     * 建堆
     *
     * @param array
     * @param size
     */
    static void makeHeap(int array[], int size) {
        if (array == null || size <= 0) {
            return;
        }
        for (int i = size / 2; i >= 0; i--) {
            selectMax(array, i, size);
        }
    }

    /**
     * 堆排序
     *
     * @param array
     */
    static void heapSort(int array[]) {
        if (array == null || array.length == 0) {
            return;
        }
        makeHeap(array, array.length - 1);
        for (int i = array.length - 1; i >= 1; i--) {
            swap(array, 0, i);
            selectMax(array, 0, i - 1);
        }
    }

    public static void main(String[] args) {
        int[] array = { 1, 2, 3, 4, 5, 6, 9, 8, 7, 10, 11, 1001, 991, 188, 188, 34, 34, 34, 33, 3, 4, 34, 343, 0 };
        System.out.println("排序前:");
        System.out.println(Arrays.toString(array));
        heapSort(array);
        System.out.println("排序后:");
        System.out.println(Arrays.toString(array));
    }

}
时间: 2024-10-23 21:50:08

堆排序简单实现的相关文章

七大常见排序算法总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.06 lutianfei none V1.1 2016.07.16 lutianfei 增加了归并排序说明 V2.0 2016.07.19 lutianfei 完善了排序算法的总结 排序另一种分法 外排序:需要在内外存之间多次交换数据才能进行 内排序: 插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序 排序方法 平均情况 最好情况 最坏情况

各种排序算法的分析及java实现

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).

【转】八大排序算法分析及JAVA实现

 原文地址http://blog.csdn.net/without0815/article/details/7697916 http://www.cnblogs.com/liuling/p/2013-7-24-01.html 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).选择排序:简单选

java的各种排序算法的分析及实现

一.插入排序 ?思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止. ?关键问题:在前面已经排好序的序列中找到合适的插入位置. ?方法: –直接插入排序 –二分插入排序 –希尔排序 ①直接插入排序(从后向前找到合适位置后插入) 1.基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止. java代码实现: package com.sort; public cla

处理海量数据的高级排序之——希尔排序(C++)

希尔算法简介                                                                                                                                        常见排序算法一般按平均时间复杂度分为两类:O(n^2):冒泡排序.选择排序.插入排序O(nlogn):归并排序.快速排序.堆排序 简单排序时间复杂度一般为O(n^2),如冒泡排序.选择排序.插入排序等高级排序时间复杂

六种常见排序算法的java实现

package edu.cn.ysw; //八种排序算法的实现与效率分析 /* * 内排序的种类: * 1.插入排序:直接插入排序.希尔排序. * 2.选择排序:简单选择排序.堆排序. 3.交换排序:冒泡排序.快速排序. 4.归并排序 5.基数排序 */ public class SortedMethods { /** * @author ysw * @param args * @throws Exception * @since 6/15/2017 */ // 直接插入排序:1.有哨兵;2.无

java 各种排序算法

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).

【自考】排序算法-插入、交换、选择、归并排序

碎碎念: 记得当初第一年的时候.接触算法.有那么两个视频.跳舞的.讲的是冒泡排序跟选择排序.当时看了好多遍终于懂了.这次多了一些算法.学起来也还好吧.咱是有基础的人.找到了以前的视频.有的就发了.没找到的就没法.其实算法并不难.绕绕就明白了.先别看代码- - 思维导图 插入排序 从头到尾巴.从第二个开始.向左进行插入.这里说的插入是指作比较.直到比较出比自己小的就插入到他的前面. 例子 1 7 4 8 6 5 插入排序 [1]7 4 8 6 5 [1 7] 4 8 6 5 [1 4 7]  8

[转]各种排序算法的分析及java实现

原文:http://www.cnblogs.com/liuling/p/2013-7-24-01.html 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几