堆排序

原创 2018年04月14日 23:17:43
#include <stdio.h>
#include <stdlib.h>
//堆排序为不稳定排序,时间复杂度为o(nlogn)
//建堆要o(n),维护堆要o(logn)
void swap(int * a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
void AdjustHeap(int *a,int i,int size)
{
    int lchild=2*i;
    int rchild=2*i+1;
    int max=i;//用来存储最大值的节点序号
    if(i <= (size/2 - 1))//如果i>最大非叶节点数则不用再调整了,因为不会影响到其他的堆结构
    {
        if(lchild<size&&a[lchild]>a[max])
        {
            max=lchild;
        }
        if(rchild<size&&a[rchild]>a[max])
        {
            max=rchild;
        }
        if(max!=i)
        {
            swap(&a[i],&a[max]);
            AdjustHeap(a,max,size);//调整过后可能影响了堆结构因此要重新调整堆
        }
    }
}
void BuildHeap(int *a,int size)
{
    int i=0;
    for(i=size/2 - 1;i >= 0;i--)//size/2-1为最大非叶节点数
    {
        AdjustHeap(a,i,size);//调整堆
    }
}
void SortHeap(int *a,int size)
{
    int i=0;
    BuildHeap(a,size);
    //把最大的元素沉到最下面,然后再把次大的继续沉下去
    for(i=size-1;i>=1;i--)
    {
        swap(&a[0],&a[i]);
        AdjustHeap(a,0,i);//调整堆
    }
}
void main()
{
    int a[]={6,50,90,20,100,3,4,8};
    int i=0;
    SortHeap(a,8);
    for(i=0;i<8;i++)
    {
        printf("%d ",a[i]);
    }
}

几种排序总结(上)——堆排序

堆排序 这几天看了算法导论的排序部分,作一下总结。 堆排序的优点        1)最坏情况下o(nlgn)的时间复杂度        2)就地排序,不用辅助数组 几种操作(以最大堆...
  • lawrencesgj
  • lawrencesgj
  • 2012-10-17 17:17:01
  • 3184

堆排序原理及其实现(C++)

堆排序原理及其实现(C++)1 堆排序的引入 我们知道`简单选择排序`的时间复杂度为O(n^2),熟悉各种排序算法的朋友都知道,这个时间复杂度是很大的,所以怎样减小简单选择排序的时间复杂度呢?从上...
  • yanglr2010
  • yanglr2010
  • 2016-10-18 21:48:02
  • 5467

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

public class HeapOperate2 { /* * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求 */ public static v...
  • zhuqiuhui
  • zhuqiuhui
  • 2016-04-21 23:29:27
  • 1436

堆排序图片详解

堆排序实例 首先,建立初始的堆结构如图: 然后,交换堆顶的元素和最后一个元素,此时最后一个位置作为有序区(有序区显示为黄色),然后进行其他无序区的堆调整,重新得到大顶堆后,...
  • u011068702
  • u011068702
  • 2016-10-09 15:23:27
  • 1503

优化的堆排序

优化的堆排序体现在不需要重新生成一个数组,而是直接原地进行所谓的堆排序。 首先,对于一个杂乱的数组,我们首先对所有的非叶子节点进行shiftdown操作,使得堆顶arr[0]的元素为最大值,如下图所...
  • qq_19782019
  • qq_19782019
  • 2017-11-06 13:42:05
  • 196

堆排序以及其应用大总结

教材上很详细,网上内容也不少,但感觉不够直观、简练、丰富。下面按照自己方式总结下。 提纲: 1)算法描述 2)代码 3)“三围”以及证明(复杂度、效率、稳定性等分析) 4)算法直接应用 5...
  • zhq651
  • zhq651
  • 2012-08-29 01:52:19
  • 10338

堆排序 纯C代码

跟上一篇实现思路一样,感觉还是少出现点幻数比较好,由于heapAdjust()调用频繁,故要尽量提高这段代码的效率 #include #define N 1000 #define INF 99...
  • architect19
  • architect19
  • 2013-05-13 22:44:30
  • 4847

排序算法(七)——堆排序

基本思想 堆排序是一种树形选择排序,是对直接选择排序的改进。   首先,我们来看看什么是堆(heap): (1)堆中某个节点的值总是不大于或不小于其父节点的值; (2)堆总是一棵完全二叉树(Compl...
  • u012152619
  • u012152619
  • 2015-08-13 08:39:32
  • 15389

【数据结构与算法】内部排序之三:堆排序(含完整源码)

堆排序、快速排序、归并排序(下篇会写这两种排序算法)的平均时间复杂度都为O(n*logn)。要弄清楚堆排序,就要先了解下二叉堆这种数据结构。本文不打算完全讲述二叉堆的所有操作,而是着重讲述堆排序中要用...
  • mmc_maodun
  • mmc_maodun
  • 2014-03-04 00:01:45
  • 23558

堆排序(基本思想以及算法实现)

1、引言 简单选择排序算法是通过比较,确定最终的位置。假设未排序的元素个数为N,则遍历一趟,需要比较N-1次,再遍历下一趟时,需比较N-2次。但是,第二次的比较是完全独立的,没有利用第一次比较的信息...
  • u012549515
  • u012549515
  • 2013-10-30 15:20:32
  • 1789
收藏助手
不良信息举报
您举报文章:堆排序
举报原因:
原因补充:

(最多只允许输入30个字)