堆排序(C语言版本)

来源:互联网 发布:linux下shell编程技巧 编辑:程序博客网 时间:2024/06/11 19:06

基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。首先建立堆,其次将堆顶与堆的最后一个位置交换,重复前两步。难点在与每次堆的建立。每次建立都从数组的索引位置 (length/2 - 1)开始 到索引位置0为止,<length为待堆排序的的数组部分的长度>,确保父节点的值大于它的左右两个儿子(可能只有一个),依次类推。注意:因为是倒的排序,所以不需要严格意义上的堆,只要保证在当前的父节点比它的儿子大就能满足要求。


代码:

#include<stdio.h>#include<windows.h>//针对堆进行调整void HeadAjust(int data[],int length){    int nChild;    int nTemp;    int flag;    int i;    i = (length/2-1);    for(;i>=0;i=flag)    {        nTemp=data[i];        nChild = 2*i+1;        if(nChild<length-1 && data[nChild+1]>data[nChild])        {            nChild++;        }        if(nTemp<data[nChild])        {            data[i] = data[nChild];            data[nChild] = nTemp;        }        flag = i - 1;    }    for(i=0;i<length;i++)    {        printf("%d\t",data[i]);    }    printf("\n\n");}//堆排序void HeadSort(int data[],int length){    int j;    int temp;    HeadAjust(data,length);    for(j=length-1;j>0;--j)    {        temp = data[j];        data[j] = data[0];        data[0] = temp;        HeadAjust(data,j);    }}int main(){    int a[] = {46,79,56,38,40,84};    int n= 6;    int i;    for(i=0;i<n;i++)    {        printf("%d\t",a[i]);    }    printf("\n\n");    HeadSort(a,n);    for(i=0;i<n;i++)    {        printf("%d\t",a[i]);    }    printf("\n");    system("pause");    return 0;}