堆排序——HeapSort

基本思想:

图示: (88,85,83,73,72,60,57,48,42,6)

平均时间复杂度:

O(NlogN)由于每次重新恢复堆的时间复杂度为O(logN),共N - 1次重新恢复堆操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN)。二次操作时间相加还是O(N * logN)。

Java代码实现:

public class HeapSortTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = new int[] { 10, 3, 2, 5, 6, 1, -2, 3, 14, 12, 3, 8, 55, 44,
                -10 };
        print(arr);
        heapSort(arr);
        System.out.println("排序后的数组:");
        print(arr);
    }

    private static void print(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + "\t");
        }
        System.out.println();
    }

    private static void swap(int[] a, int i, int j) {
        a[i] = a[i] + a[j];
        a[j] = a[i] - a[j];
        a[i] = a[i] - a[j];
    }

    private static void heapSort(int[] a) {
        for (int i = a.length - 1; i >= 0; i--) {
            createMaxHeap(a, i);
            swap(a, 0, i);
            print(a);
        }
    }

    private static void createMaxHeap(int[] a, int lastIndex) {
        for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
            int k = i;
            while ((2 * k + 1) <= lastIndex) {
                int biggerIndex = 2 * k + 1;
                if (biggerIndex < lastIndex) {
                    if (a[biggerIndex] < a[biggerIndex + 1]) {
                        biggerIndex++;
                    }
                }
                if (a[k] < a[biggerIndex]) {
                    swap(a, k, biggerIndex);
                    k = biggerIndex;
                } else {
                    break;
                }
            }
        }
    }
}
时间: 2024-10-06 16:54:01

堆排序——HeapSort的相关文章

三、堆排序(Heapsort),优先队列可以用于O(N log N)

三.堆排序(Heapsort) 优先队列可以用于O(N log N) 存储空间增加一倍 排序类别 排序方法 时间复杂度 时间复 杂度 空间复杂度 稳定性 复杂性 平均情况 最坏情况 最好情况 选择排序 堆排序 O(nlog2n) O(nlog2n) O(nlog2n) O(1) 不稳定 较复杂 堆排序:堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.首先简单了解下堆结构. 堆:堆是具有以下性质的完全二叉树

堆排序HeapSort

堆排序,顾名思义,是采用数据结构堆来进行排序的一种排序算法. 研究没有规律的堆,没有任何意义.特殊的堆有最大堆(父节点值大于等于左右字节点值),最小堆(父节点值小于等于子节点值).一般采用最大堆来进行排序,图1为最大堆来表示一维数组. 图1 最大堆表示一维数组 2叉树堆的几点特性 1. 最后父节点索引值 不妨设堆的总元素个数为N:最后一个父节点的索引值Index = N/2 :可以写几个简单的堆进行数学归纳.图1中的最后一个父节点5 = 10 /2 : 这个特性主要是在采用自底向上构建堆的时候,

堆排序 Heapsort

堆排序: 1 #include<stdio.h> 2 //#include<stdlib.h> 3 4 void PrintArray(int data[] ,int length){ 5 int i; 6 for(i=0;i<length;i++){ 7 printf("%d ",data[i]); 8 } 9 printf("\n"); 10 } 11 12 //heap_size;堆的大小 13 // 堆化,保持堆的性质 14 /

[算法学习笔记]排序算法——堆排序

堆排序 堆排序(heapsort)也是一种相对高效的排序方法,堆排序的时间复杂度为O(n lgn),同时堆排序使用了一种名为堆的数据结构进行管理. 二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 如上图显示,(a)是一个二叉堆(最大堆), (b)是这个二叉堆在数组中的存储形式. 通过给个一个节点的下标i, 很容易计算出其父节点,左右子节点的的下标,为了方便,

15. 蛤蟆的数据结构进阶十五排序实现之堆排序

15. 蛤蟆的数据结构进阶十五排序实现之堆排序 本篇名言:"谁要是游戏人生 ,他就一事无成 ; 谁不能主宰自己 ,永远是一个奴隶.--歌德" 继续来看下堆排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47733553 1.  堆排序 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完全二叉树

Java排序算法(五):堆排序

[算法说明] 堆排序是对简单选择排序的改进 简单选择排序是从n个记录中找出一个最小的记录,需要比较n-1次.但是这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多. 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆. [算法思想] 将待排序的序列构造成一个大顶

哈希表、堆排序

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表.(Java中的实现可以基于数组,把一个数据项的关键字映射成数组下标) 1.开放地址法 若数据不能直接放在由哈希函数计算出来的数组下标所指的单元时,就要寻找数组的其他位置.开放地址法有三种常用的方法:线性探测(+1).二次探测(+1^2,+2^2...).再哈希法(使用

算法练习--快速排序、堆排序

正题: 1.快速排序 原理:在初始序列中选择一个参考值,将序列其他数和该值进行对比,小的放一边大的放一边,然后把划分的两数组看成新序列,重新选择参考值,并比较划分.知道每个数组的元素个数为1停止. 代码:第一眼看上去,貌似递归的方式来弄比较好. <?phpfunction Quick_sort(&$list , $start , $count) { if($start >= $count - 1) //设定终止条件. { return; } $i = $start; $j = $cou

排序 选择排序&amp;&amp;堆排序

选择排序&&堆排序 1.选择排序: 介绍:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 步骤:假设数组array长度为N即有数组内有N个数据未排序数据 1.第一趟遍历将这N个数据中最小的数据和array[0]交换. 2.第二趟则遍历N-1个数据,将这N-1个数据中最小的和arra