【C语言数据结构】选择排序:堆排序 | 直接(简单)选择排序(原理&完整代码)

一、直接(简单)选择排序

1.思路

每趟排序在当前待排序序列中选出关键码最小的记录,添加到有序序列中。

2.代码

void selectsort(int r[],int n)
{
    int i,j,min,t;
    for(i=0;i<n-1;i++)
    {
        min=i;
        for(j=i+1;j<n;j++)
            if(r[j]<r[min])
            min=j;

        if(min!=i)
        {
            t=r[i];r[i]=r[min];r[min]=t;
        }
    }
}

3.性能

比较次数 (n-1+1)*(n-1) / 2 = O(n * 2)

二、堆排序

1、思想

每次构造一个堆(堆就是完全二叉树),将堆的根节点(最大值或最小值)添加到有序序列中。
堆是具有下列性质的完全二叉树:

  • 小根堆:每个结点的值都小于或等于其左右孩子结点的值
  • 大根堆:每个结点的值都大于或等于其左右孩子结点的值

步骤

1、从下往上、从右到左 使根节点数据大于左右子树(左右子树大小不用管)使数据基本有序
2、处理对顶记录:r[ 1 ] 与r [n-k+1] 元素交换 ,把最大的元素放最后,进入有序区
3、调整剩余记录 : 此时剩余记录有n-k个(把最大的调到最后不管), sift(r,1,n-k)

2、代码

#include <stdio.h>
#include <stdlib.h>

void shift(int r[],int k,int end)
{
    int i,j,t;
    i=k;
    j=2*i;
    while(j<=end)
    {
        if(j<end && r[j]<r[j+1])
            j++;
        if(r[i]<r[j])
        {
            t=r[i];r[i]=r[j];r[j]=t;
        }
        i=j;
        j=2*i;
    }

}

void Heapsort(int r[],int n)   //数据从1开始储存
{
    int k,t;
    for(k=n/2;k>=1;k--)  //初建堆
        shift(r,k,n);
    for(k=1;k<n;k++)
    {
        t=r[1];r[1]=r[n-k+1];r[n-k+1]=t;  //移走堆顶元素
        shift(r,1,n-k);               //重建堆
    }
}
int main()
{
    int a[9]={0,32,20,62,5,24,68,2,88};  //第一个0是占位的
    Heapsort(a,8);
    for(int j=1;j<9;j++)
        printf("%d ",a[j]);
    return 0;
}

在这里插入图片描述

在这里插入图片描述

3、性能

时间复杂度 O(nlogn)
在这里插入图片描述
来源B站懒猫老师,这个老师将得非常好,建议友友们去看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yyzuimei

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

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

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

打赏作者

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

抵扣说明:

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

余额充值