排序---堆排

排序—堆排

堆排采用简单的二叉数首先我们简单的介绍一下二叉数:

这是一个简单的二叉数(该二叉数父节点的值比子节点的大)
下面我们看一个父节点小于子节点的
在这里插入图片描述
二叉数可以由数组来表示
在这里插入图片描述

在这里圆圈里面的数表示数组的值数组的下标就是它们的序号
它们的序号有一些规律:

左子节点序号 = 父节点序号×2 +1
右子节点序号 = 父节点序号×2 +2

下面我们简单的以图片的方式了解二叉数的原理:

在这里插入图片描述

下面讲解如何操作:

首先把要排序的数变成一个二叉数,这里就不需要了,我们可以把数组看成一个二叉数

1.我们需要先把二叉数变为父节点都比子节点大的形态,

2.然后交换最上面的节点(数组中的a[0])和右下方的节点(数组中的a[n]最后一个),这样a[n]就是最大的

3.后面继续第一步,第二步(在这时不要包括a[n])

#include <stdio.h>

void swap(int A[], int i, int j)   //用来交换两个数
{
    int t = A[i];
    A[i] = A[j];
    A[j] = t;
}

void duipai(int A[],int n)       //堆排
{
    int k = 0,h = n;
    while(k<h)
    {
        for(int i = n-1;i>=0;i--)
        {
            int s = (i-1)/2;
            if(A[s] < A[i])
            {
                swap(A, i, s);
            }
        }
        swap(A, 0, n-1);
        n = n - 1;
        k++;
    }
}

int main()
{
    int A[100] = {0};                           //定义一个长为100的数组并初始化为0
    int n;
    scanf("%d",&n);                             // 输入数组长度
    for(int i = 0;i<n;i++)                      //输入数组
    {
        scanf("%d",&A[i]);
    }
    duipai(A,n);
    for(int j = 0;j<n;j++)
    {
        printf("%d\t",A[j]);
    }

    return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值