首页 > 编程语言 >c++ 堆排序

c++ 堆排序

时间:2023-09-02 20:33:39浏览次数:34  
标签:lchild int 堆排序 maxHeap tree c++ max rchild

堆排序主要分为两个函数:
1、构建堆
2、元素调整

#include <iostream>
using namespace std;



void maxHeap(int tree[], int n, int i) {
	if (i >= n) 
		return;

	int lchild = i*2 + 1;
	int rchild = i*2 + 2;
	int max = i;

	if (lchild < n && tree[lchild] > tree[max]) {
		max = lchild;
	}

	if (rchild < n && tree[rchild] > tree[max]) {
		max = rchild;
	}

	if (max != i) {
		swap(tree[max], tree[i]);
		maxHeap(tree, n, max);
	}
}

void buildHeap(int tree[], int n) {
	if (n < 2) 
		return;

	int lastNode = n - 1;
	int lastParent = lastNode - 1 / 2;
	while (lastParent--) {
		maxHeap(tree, n, lastParent);
	}
}

void heapSort(int tree[], int n) {
    if (n < 2) 
		return;
    std::cout << "start build heap" << std::endl;
    buildHeap(tree, n);
	std::cout << "build heap succ" << std::endl;

    for (int i = n-1; i >= 0; i--) {
        swap(tree[0], tree[i]);
        maxHeap(tree, i, 0);
    }
	std::cout << "heap sort succ" << std::endl;
}

int main() {
    int tree[5] = {3, 5, 1, 9, 2};
    heapSort(tree, 5);

    for (int i=0; i < 5; i++) {
        std::cout << tree[i] << std::endl;
    }
    return 0;
}

标签:lchild,int,堆排序,maxHeap,tree,c++,max,rchild
From: https://www.cnblogs.com/xiaohaigegede/p/17674170.html

相关文章

  • C++ Core Guidelines解析 电子书 pdf
    关注公众号:红宸笑。回复:电子书即可  在《C++CoreGuidelines解析》中,C++专家讲师RainerGrimm提炼出了CoreGuidelines中的精髓,去除了晦涩难懂的内容,分享了新的见解和背景,并提供了自己培训课程中经过充分测试的示例。对于使用C++11及后续版本C++的有经验程序员,G......
  • C++刷题输入输出和常用函数处理
    1.输入数字但非默认的十进制,比如输入的是十六进制数,但要转为十进制再进行别的处理。当我们在编程中处理十六进制数时,通常会将其表示为字符串。cin>>hex>>m;//输入十六进制,m会自动转十进制。2.int和string中单个字符互转strings="12345";inta0=s[0]-'0';//字符转......
  • 堆排序 桶排序 基数排序
    堆排序使用数组和表示堆大小的整数heapSize表示堆:vector<int>arr{9,5,3,7,2};intheapSize=5;heapSize=5表示数组从索引0开始的5个元素表示一个堆。堆结构就是用数组实现的完全二叉树结构。求数组中索引i位置节点的父子节点:父节点:(i-1)/2左子节点:2*i+1右子节......
  • C++语言学习07
    一、类型信息运算符typeid在C++中typeid可以获取数据的类型,但是需要加头文件typeinfofind/usr/include-nametypeinfo1、typeid是运算符,执行运算符函数,执行的返回值类型是type_info类类型对象2、type_info中有个name的成员函数3、type_info中还重载了==运算符,可以直接......
  • linux C++ UDP
    1.UDP与TCP差异:注意:UDP不同于TCP,没有请求连接过程connect()与受理过程accpet(),因此无法区分客户端与服务器端。TCP与UDP差异仅仅在于TCP存在在不可靠IP层的流控制机制,所以TCP可以提供可靠数据服务,形象化的比喻就是TCP相当于打电话,而UDP相当于信封,电话得先建立一个可靠的信道,再......
  • c++编译
    1.1c++编译c++脚本程序写完之后,并不能直接运行,需要进行编译,转成.o文件,再链接才能运行,一般包括:预处理,汇编,编译。链接四步,如下:预编译把.c源文件编译成.ii预处理文件gcc-E[源文件.c]-o[自定义名.ii]编译成汇编语言把.i文件编译成.s汇编语言文件gcc-S[......
  • C++程序的内存模型--模型四区
      C++中在程序运行前分为全局区和代码区 代码区特点是共享和只读 全局区中存放全局变量、静态变量、常量 常量区中存放const修饰的全局变量和字符串常量 //栈区//由编译器自动分配释放、存放函数的参数值、局部变量等//注意:不要返回局部变量的地址,栈区开辟的数据由编译器......
  • linux开发C/C++
    最近在部署项目的时候总是会遇到关于C++的编译问题,由于之前学习C++只是为了参加算法竞赛,缺少这一部分的知识,所以学习一下这一相关内容,并做一下记录参考:VSCode开发C++七讲【基于VSCode和CMake实现C/C++开发|Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?p=17&vd_sourc......
  • C/C++毕业设计管理系统[2023-09-02]
    C/C++毕业设计管理系统[2023-09-02]二、毕业设计管理系统学校有若干学院,每个学院有若干专业,需要通过一个毕业设计管理系统对现有的毕业设计情况进行管理。系统适用对象:教务处管理员、院系负责人、教师、学生。1、教务处管理员:全校教学事务管理、全校课题过程管理、学生及课题......
  • 《C++并发编程实战》读书笔记(1):线程管控
    1、线程的基本管控包含头文件<thread>后,通过构建std::thread对象启动线程,任何可调用类型都适用于std::thread。voiddo_some_work();structBackgroundTask{voidoperator()()const;};//空的thread对象,不接管任何线程函数std::threadt1;//传入普通函数std::thr......