选择排序——堆排序

本文介绍堆排序的基本概念,包括其构建过程和排序步骤,并提供详细的C语言实现代码。此外,还分析了堆排序的时间复杂度为O(nlog2n),空间复杂度为O(1),但排序过程不稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##堆排序

  堆排序分为两个过程:

1、将原来无序的数列,转化成堆序列(建初识堆的过程);

2、输出堆顶元素并调整建新堆的过程;

  数据结构伪代码:

typeof SqList HeapType;
void HeapAdjuistI(HeapType &H, int s , int m) {
  rc = H.r(s);
  for(j = 2*s;j<=m;j*=2){//沿key较大的孩子节点向下筛选
    if(j<m && LT(H.r[j].key,H.r[j+1].key) ){
      ++j;
    }
    if(LT(rc.key,H.r[j].key) )break;
    else{
      H.r[s] = H.r[j];
      s=j;
    }
  }
  H.r[s] = rc;
}


void HeapSort(HeapType &H ) {
  for(i = H.length/2;i>0;--i) {
    HeapAdjust(H,i,H.length);
  }
  for(i = H.length;i>1;--i) {
    H.r[1]  <> H.r[i];


    HeapAdjust(H, 1, i-1);
  }
}

C语言代码:

//建堆的方法
void HeapAdjust (int array[], int s, int length)
{
    int j;
    for(;2*s +1<length-1;s = j)
    {
        j = 2*s +1;
        if(j<length-1 &&  array[j+1] > array[j]) j++;
        if(array[s] < array[j])
        {
            int temp = array[s];
            array[s] = array[j];
            array[j] = temp;
        }else break;
        int a;
            for(a =0;a<10;a++)
            {
                printf("#%d ",array[a]);
            }
            printf("******************************\n");
    }
}

//堆排序
void HeapSprt(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--)
    {
        int temp;
        temp = array[0];
        array[0] = array[i];
        array[i] = temp;
        HeapAdjust(array,0,i);
    }
}

int main()
{
    int i;
    int num[]={9,8,7,6,5,4,3,2,11,0};
    HeapSprt(num,sizeof(num)/sizeof(int));
    for(i=0;i<sizeof(num)/sizeof(int);i++)
    {
        printf("%d ",num[i]);
    }
    printf("\nok\n");
    return 0;
}
时间效率:O(nlog2n);

空间效率:O(1);

稳定性:不稳定;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖飞_coffee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值