美文网首页
堆排序代码

堆排序代码

作者: ZealPenK | 来源:发表于2016-09-08 13:10 被阅读0次

include <stdio.h>

//array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度
//本函数功能是:根据数组array构建大根堆
void HeapAdjust(int array[],int i,int nLength)
{
int nChild;
int nTemp;
for(;2i+1<nLength;i=nChild)
{
//子结点的位置=2
(父结点位置)+1
nChild=2*i+1;
//得到子结点中较大的结点
if(nChild<nLength-1&&array[nChild+1]>array[nChild])++nChild;
//如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
if(array[i]<array[nChild])
{
nTemp=array[i];
array[i]=array[nChild];
array[nChild]=nTemp;
}
else break; //否则退出循环
}
}
//堆排序算法
void HeapSort(int array[],int length)
{
int i;
//调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
//length/2-1是最后一个非叶节点,此处"/"为整除
for(i=length/2-1;i>=0;--i)
HeapAdjust(array,i,length);
//从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
for(i=length-1;i>0;--i)
{
//把第一个元素和当前的最后一个元素交换,
//保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
array[i]=array[0]^array[i];
array[0]=array[0]^array[i];
array[i]=array[0]^array[i];
//不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
HeapAdjust(array,0,i);
}
}

int main()
{
int i;
int num[]={9,8,7,6,5,4,3,2,1,0};
HeapSort(num,sizeof(num)/sizeof(int));
for(i=0;i<sizeof(num)/sizeof(int);i++)
{
printf("%d ",num[i]);
}
printf("\nok\n");
return 0;
}

相关文章

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 14.排序算法(5)

    1.堆排序介绍 2. 代码实现

  • 堆排序代码

    include //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数...

  • 堆排序

    概述 堆排序基于完全二叉树进行排序, 稳定性 堆排序不稳定 时间复杂度 堆排序的时间复杂度为 nlogn C代码

  • C#实现堆排序源码

    下面代码段是关于C#实现堆排序的代码。 private static void HeapSortFunct...

  • C#堆排序源码

    如下的代码内容是关于C#堆排序的代码。 private static void Adjust (int[] lis...

  • 堆排序java代码

    public class HeapSort { }

  • 堆排序伪代码

  • 堆排序-C++代码

  • 堆排序(oc代码实现)

    概念 堆是一棵顺序存储的完全二叉树,分为大根堆和小根堆 分类 小根堆每个结点的关键字都不大于其孩子结点的关键字。 ...

网友评论

      本文标题:堆排序代码

      本文链接:https://www.haomeiwen.com/subject/ttmsettx.html