堆排序(c实现)

int sort_heap(int arr[],int len)
{
        int k,i,j,l;
        for(k=len;k>1;k--)//len-1次循环
        {
                for(i=k/2;i>=0;i--)//从中间位置开始遍历
                {
                        for(j=i;j*2+1<k;)//child进行遍历
                        {
                                l=j*2+1;//left child
                                if(l+1<k && arr[l]<arr[l+1])
                                {
                                        l++;
                                }
                                if(arr[l]>arr[j])
                                {
                                        swap(&arr[l],&arr[j]);
                                        j=l;
                                }
                                else
                                {
                                        break;
                                }
                        }
                }
                swap(&arr[0],&arr[k-1]);
        }
}
extern int swap(int *a , int *b)
{
        *a = *a ^ *b;
        *b = *a ^ *b;
        *a = *a ^ *b;
}
int main()
{
        int arr[8]={2,3,5,1,9,8,4,6},i;
        sort_heap(arr,8);
        for(i=0;i<8;i++)
        {
                printf ("%d,",arr[i]);
        }
        return 0;
}

堆排主要分两步:

1、循环n-1次,每次找出最大的一个,然后与最后一个替换,循环一次,将最大索引-1

2、从中间开始循环,将最大的一个放入支点,并将子节点按大小顺序排好


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值