数据结构浅学--堆排序

本文介绍了堆排序算法的基本概念,包括堆的性质、存储方式和排序原理。堆排序是一种利用堆这种数据结构进行排序的高效算法,通过构建最大堆或最小堆,实现元素的逐步调整和排序。文章提供了C语言的实现代码,详细展示了堆排序的过程,包括堆调整和数组交换等关键步骤。
摘要由CSDN通过智能技术生成

堆排序

要想了解堆排序首先我们要了解堆。
堆:堆一般指的是二叉堆,顾名思义,二叉堆是完全二叉树或者近似完全二叉树

堆的性质

① 是一棵完全二叉树
② 每个节点的值都大于或等于其子节点的值,为最大堆;反之为最小堆
在这里插入图片描述
:该完全二叉树的子结点都大于父结点所以为最小堆

堆的储存

用数组来表示堆,下标为i结点的父结点下标为(i-1)/2;而其左右子结点分别为(2i+1),(2i+2)
所以上图所示的堆可以用a[11] = {0,1,2,3,4,5,6,7,8}来表示

堆排序的定义

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

基本思想

1.将待排序的数列构造成一个最大堆,这时数列的最大值为根结点。
2.将根结点与待排序列的最后一个元素交换
3.再将其剔除并将其他的元素维护成一个最大堆,最终排序出来的是为一个递增序列

实现步骤.

sort.h

#ifndef _SORT_H_
#define _SORT_H_

void produce_arr(int *__src, int length);

void traversal_arr(int *__src, int length);

void swap(int *__src, int *__dest);

void heapadjust(int *__src, int length, int i);

void heapsort(int *__src, int length);

#endif

sort.c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"sort.h"


void produce_arr(int *__src, int length)
{
    srand(time(NULL));
    for(int i = 0;i<length;i++)
        __src[i] = rand()%100;
}

void traversal_arr(int *__src, int length)
{
    for (int i = 0; i < length; i++)
    {
        printf("%d ",__src[i]);
    }
    printf("\n");
}

void swap(int *__src, int *__dest)
{
    int temp = *__src;
    *__src = *__dest;
    *__dest = temp;
}


//堆排序;
void heapadjust(int *__src, int length, int i)
{
    int max = i;
    int lchild = i*2+1;
    int rchild = i*2+2;
    if(lchild < length && __src[max] < __src[lchild])
        max = lchild;
    if (rchild < length && __src[max] < __src[rchild])
        max = rchild;
    if(max != i)
    {
        swap(&__src[max],&__src[i]);
        heapadjust(__src,length,max);
    }
}

void heapsort(int *__src, int length)
{
    int i;
    for(i=length/2-1;i>=0;i--)
        heapadjust(__src,length,i);
    for(i=length-1;i>0;i--)
    {
        swap(&__src[i],&__src[0]);
        heapadjust(__src,i,0);
    }
}

主函数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"sort.h"
#define LENGTH 10


int main()
{
    int arr[LENGTH];
	
    produce_arr(arr, LENGTH);
	
    printf("the original array is:\n");
	
    traversal_arr(arr, LENGTH);
	
    heapsort(arr, LENGTH);
	
    printf("after the heapsort is:\n");
	
    traversal_arr(arr, LENGTH);
	
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值