堆排序菜鸟入门

来源:互联网 发布:3d人体模型软件 编辑:程序博客网 时间:2024/06/14 15:33

了解过快速排序和归并排序之后,还有一个比较实用而且和前两者的时间效率相同的排序自然要学习一下了。

在有了那么多高手的博客,我还写这个,主要是为了自学,加个原创是为了有激情哈哈

直接来

实例: Arr[14] = {9,8,5,2,1,4,7,6,3,0,15,5,9,4};将该数组进行堆排序。


首先,讲二叉堆的两个性质



就是求最后一个非叶子节点,和父子节点的关系。


Arr[14] = {9,8,5,2,1,4,7,6,3,0,15,5,9,4}    的二叉堆是:



接着:




获得第一个有序的二叉堆比较复杂,之后每次只需要将用来交换的分支排序即可



代码,参考百度百科,与上图一一对应》》》》》

#include <stdio.h>//建堆void HeapAdjust(int array[],int i,int nLength){    int nChild;    int nTemp;    //1.如果左子节点存在的话,左右子节点进行比较然后,得出较大的Array[nChild]    //2.将较大的子节点与该父节点比较,大于父节点则交换,小于则退出。    //3.将与父节点交换的子节点作为父节点循环,目的是取出该分支剩下的最大的值    //4.直到没有子节点为止    for(;2*i+1<nLength;i=nChild)    {        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;    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];        HeapAdjust(array,0,i);    }}int main(){    int i;    int num[]={9,8,5,2,1,4,7,6,3,0,15,5,9,4};    HeapSort(num,sizeof(num)/sizeof(num[0]));    for(i=0;i<sizeof(num)/sizeof(num[0]);i++)        printf("%d\t",num[i]);    return 0;}


只是学习,多有不足,只能上了。

原创粉丝点击