排序算法 七.堆排序

堆排序是一种利用堆数据结构进行排序的算法,平均时间复杂度为O(n log n)。它通过建立最大堆或最小堆,将堆顶元素与末尾元素交换来达到排序目的。在C++和C语言中,堆排序可以通过ShiftDown和MakeHeap等函数实现。

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

堆排序

a.

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

b.

平均时间复杂度:O(n log n)

c.

实现
将序列按堆的定义建成堆(如大根堆),从而堆顶的关键字最大,将堆顶与堆末交换,这趟得到了最大数,并把末元素从堆中去掉,然后在将堆顶调整为堆,从而堆顶为次大数,如此反复,只到堆中只剩一个元素为止,此时数组的元素为递增序列

d.

C语言

#include<stdio.h>
void Heapadjust(int R[],int s,int m){      //s使R[s]到R[m]为大根堆
    int i; 
    i=s;
    int temp=R[i];
    for(int j=2*i+1;j<=m;j=2*j+1){
        if(j<m && R[j]<R[j+1]){ j++; }
        if(temp>=R[j]) break;
        R[i]=R[j];
        i=j;
    }
    R[i]=temp;                        
}

void HeapSort(int R[],int n){//将数组R[0]到R[n-1]中的n个整数进行堆排序
    int i;
    int temp;
    for(i=n/1-1;i>0;i--){      
        Heapadjust(R,i,n-1);
    } 
    for(i=n-1;i>0;i--){       
        temp=R[0];             
        R[0]=R[i];
        R[i]=temp;
        Heapadjust(R,0,i-1);        
    } 
}

void main(){
    int n[10];
    printf("请输入10个数,以逗号隔开:");
    scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6],&n[7],&n[8],&n[9]);
    HeapSort(n,10);
    for(int i=0;i<=9;i++){
        printf("%d ",n[i]);
    }
    printf("\n");
}

运行
在这里插入图片描述
C++
ShiftDown函数(下移)

id ShiftDown(int Heap[],int i,int N)   //过程名(数组名,下移元素下标,堆长度){
    int t;
    if(2*i>N)
        return;         //该结点是叶子
    do{
        i=i*2;
        if(i+1<=N && Heap[i+1]>Heap[i])
            i++;        //
            i=i*2+2(若要提升,则选择大者)
        if(Heap[i/2]<Heap[i])
            t=Heap[i/2],Heap[i/2]=Heap[i],Heap[i]=t;
        else 
             break;
     }while(2*i<=N);
}

MakeHeap函数(创建堆)

#include "ShiftDown.h"
void MakeHeap(int Heap[],int N)
{
 for(int i=N/2;i>0;i--)
  ShiftDown(Heap,i,N);
}

堆排序

#include <iostream.h>
#include "MakeHeap.h"
void HeapSort(int Heap[],int N)
{
 MakeHeap(Heap,N);
 int t,Len=N;
 for(int i=N;i>1;i--){
  t=Heap[i],Heap[i]=Heap[1],Heap[1]=t; //将最大元素和尾部元素互换
  --Len;
  ShiftDown(Heap,1,Len);
 }
}
void main()
{
 int A[]={NULL,      //A[0]不使用
  20,17,99,10,11,4,5,3,7,10,90
 };
 const int N=sizeof(A)/sizeof(int)-1;
 for(int i=1;i<=N;i++)
  cout<<A[i]<<' ';
 cout<<endl;
 HeapSort(A,N);
 for(i=1;i<=N;i++)
  cout<<A[i]<<' ';
 cout<<endl;
}

运行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值