算法导论 第六章 堆排序

news/2024/5/19 4:57:31 标签: 算法导论, 堆排序

以下C代码在clion上调试通过,编译器为clang.
根据算法导论伪码编写,说明见注释

#include <stdio.h>

void max_heapify(int *A, int i,int heap_size)//调整堆.让A[i]在最大堆中下降,使以i为根的子树成为最大堆
{
    int l =2*i;//计算i的左子下标
    int r =2*i + 1;//计算i的右子下标
    int largest = -1;
    int temp = 0;

    if( (l<=heap_size) && (A[l]>A[i]) )//保证不越界的情况下,比较i与其左右子结点
        largest = l;                   //并使largest指向三者中key最大的结点
    else
        largest = i;
    if( (r<=heap_size) && (A[r]>A[largest]) )
        largest = r;

    if(largest!=i)//若largest不是i,即找到了新largest
    {             //将A[i]与A[largest]互换 
        temp = A[i];
        A[i] = A[largest];
        A[largest] = temp;
        max_heapify(A,largest,heap_size);//以新的largest为根,递归向下调整子树
    }
}

void build_max_heap(int *A,int heap_size)//建大根堆
{
    int i;
    for(i = heap_size/2;i>=1;i--)//从heap_size/2开始调整堆,因为这是下标最大的非叶结点
        max_heapify(A,i,heap_size);//调整以i为根的子树
}

void heapsort(int *A,int heap_size)//堆排序
{
    build_max_heap(A,heap_size);
    int temp = 0;
    int i;
    for(i=heap_size;i>=2;i--)
    {
        temp = A[1];
        A[1] = A[i];
        A[i] = temp;
        heap_size--;
        max_heapify(A,1,heap_size);
    }
}

int main()
{
    int A[11] = {-1,4,1,3,2,16,9,10,14,8,7};//由于算法从1开始操作,故A[0]置为-1,表示不使用
    heapsort(A,10);
    int i;
    for( i = 1;i<11;i++)
       printf("%d ",A[i]);
    return 0;
}

每次将大根堆的根移出堆(放到最后一片叶节点),然后堆size-1,因此输出为升序:
1 2 3 4 7 8 9 10 14 16


http://www.niftyadmin.cn/n/1454311.html

相关文章

5、德才论

题目描述 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c;与其得小人…

处理2D图像和纹理——创建一个3D爆炸效果,简单的粒子系统

问题 你想在3D世界中创建一个漂亮的3D爆炸效果。 解决方案 你可以通过混合大量的小火焰图像&#xff08;叫做粒子&#xff09;创建一个爆炸效果,&#xff0c;如图3-22所示。注意一个单独的粒子很暗&#xff0c;但是&#xff0c;如果你添加大量的粒子&#xff0c;就会获得一个漂…

php提取字符串中的数字

2019独角兽企业重金招聘Python工程师标准>>> 第一种方法&#xff0c;使用正则表达式&#xff1a; function findNum($str){$strtrim($str);if(empty($str)){return ;}$reg/(\d{3}(\.\d)?)/is;//匹配数字的正则表达式preg_match_all($reg,$str,$result);if(is_arra…

算法导论 15.1动态规划 装配线调度

代码根据15.1中伪代码编写 #include<stdio.h>int e[3]{-1,2,4}; int x[3]{-1,3,2}; int n 6; //a1[j]表示a(1,j)&#xff0c;a2[j]表示a(2,j)&#xff0c;以此类推&#xff0c;a1[0]不使用&#xff0c;设为-1 int a1[7]{-1,7,9,3,4,8,4}; int a2[7]{-1,8,5,6,4,5,7}; …

6、部分A+B

题目描述 正整数A的“DA&#xff08;为1位整数&#xff09;部分”定义为由A中所有DA组成的新整数PA。例如&#xff1a;给定A 3862767&#xff0c;DA 6&#xff0c;则A的“6部分”PA是66&#xff0c;因为A中有2个6。现给定A、DA、B、DB&#xff0c;请编写程序计算PA PB。 输…

NPOI读取excel功能,兼容xls和xlsx

样例: IWorkbook workbook;string fileExt Path.GetExtension(filePath);try{using (var file new FileStream(filePath, FileMode.Open, FileAccess.Read)){if (fileExt ".xls"){workbook new HSSFWorkbook(file);}else if (fileExt ".xlsx"){workbo…

7、A除以B

题目描述 本题要求计算A/B&#xff0c;其中A是不超过1000位的正整数&#xff0c;B是1位正整数。你需要输出商数Q和余数R&#xff0c;使得A B * Q R成立。输入描述: 输入在1行中依次给出A和B&#xff0c;中间以1空格分隔。输出描述: 在1行中依次输出Q和R&#xff0c;中间以…

【转】Java内存模型 http://blog.csdn.net/silentbalanceyh

【转】Java内存模型 http://blog.csdn.net/silentbalanceyh &#xff08;原本准备把内存模型单独放到某一篇文章的某个章节里面讲解&#xff0c;后来查阅了国外很多文档才发现其实JVM内存模型的内容还蛮多的&#xff0c;所以直接作为一个章节的基础知识来讲解&#xff0c;可能该…