首页 > 编程语言 >堆排序算法

堆排序算法

时间:2024-04-06 22:00:05浏览次数:22  
标签:结点 int max 最大值 堆排序 len Heapify 算法

问题描述

现有一组数据:23,45,18,11,13,79,72,25,3,17。
请使用快速排序算法将它们按照从小到大的顺序排列。

算法思想

(1)将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

(2)将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;

(3)重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

程序代码

#include <iostream>
using namespace std;
const int N = 10;
/*定义交换函数*/
void swap(int& x, int& y) {//使用引用作为参数,来改变变量本身的值
    int t = x;
    x = y;
    y = t;
}
/*定义堆调整函数*/
void Heapify(int a[], int len, int k) {
    if (k < len) {
        int max = k; //根结点
        int L = 2 * k + 1; // 左子节点
        int R = 2 * k + 2; // 右子节点
        /*找出最大结点*/
        if (L < len && a[L] > a[max]) {
            max = L;
        }
        if (R < len && a[R] > a[max]) {
            max = R;
        }
        /*交换最大子节点到根结点并做递归*/
        if (max != k) {
            swap(a[k], a[max]);
            Heapify(a, len, max);
        }
    }

}
/*堆排序函数*/
void heapSort(int b[], int len) {
    /*构造最大堆*/
    for (int i = (len - 1) / 2; i >= 0; i--) {
        Heapify(b, len, i);//从最后一个父结点开始做最大堆调整,构造最大堆
    }
    for (int i = len - 1; i >= 0; i--) {//依次将最大堆的根结点(最大值)取出
        swap(b[0], b[i]);//将最大堆的根(最大值)换到最后
        Heapify(b, i, 0);//除去最大值,对交换后的二叉树做最大堆调整,使二叉树根结点始终为最大值
    }
}
int main() {

    int c[N] = { 23,45,18,11,13,79,72,25,3,17 };//定义一个数组,给定需要进行排序的序列
    for (int i = 0; i < N; i++) {
       cin>>c[i];
    }
    
    cout << "排序前:" << endl;
    for (int i = 0; i < N; i++) {
        cout << c[i] << " ";
    }
    heapSort(c, N);
    cout << "\n排序后:" << endl;
    for (int i = 0; i < N; i++) {
        cout << c[i] << " ";
    }//依次输出排序完成后的数组元素
    return 0;
}

标签:结点,int,max,最大值,堆排序,len,Heapify,算法
From: https://blog.csdn.net/weixin_63131750/article/details/137437816

相关文章

  • 蓝桥杯 试题 算法训练 拿金币
    问题描述有一个NxN的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。输入格式第一行输入一个正整数n。以下n行描述该方格。金币数保......
  • c++算法学习笔记 (20) 哈希表
    1.模拟散列表//拉链法#include<bits/stdc++.h>usingnamespacestd;constintN=100003;inth[N];inte[N],ne[N],idx;//存链voidinsert(intx){intk=(x%N+N)%N;//让负数的余数变成正数(若直接加N,则可能溢出)e[idx]=x;ne[idx]......
  • c++算法学习笔记 (21) STL
    1.vector:        变长数组,倍增的思想        size()返回元素个数        empty()返回是否为空        clear()清空        front()/back()元素        push_back()/pop_back()        begin()/end()迭代器 ......
  • c++算法学习笔记 (19) 堆
    1.堆排序:(1)插入一个数:heap[++size]=x;up(size);//在最后插入,再往上移(2)求集合中最小值:heap[1](3)删除最小值:swap(heap[1],heap[size]);size--;down(1);//将最小值移到最后直接删除,再将heap[1]下移到合适位置(4)删除任意一个元素:swap(heap[k],heap[size]);size--;down(1)orup(1);/......
  • Python常用算法--排序算法【附源码】
    应用具体python案例方式展示各种排序的要点,特别是希尔排序、插入排序、选择排序、冒泡排序、堆排序、快速排序、归并排序七个具体的排序算法。一、希尔排序:解释:希尔排序(ShellSort)是一种插入排序的改进版本,也被称为缩小增量排序。希尔排序通过比较相距一定间隔的元素,将大间隔......
  • FJSP:蜣螂优化算法( Dung beetle optimizer, DBO)求解柔性作业车间调度问题(FJSP),提供MAT
    一、柔性作业车间调度问题柔性作业车间调度问题(FlexibleJobShopSchedulingProblem,FJSP),是一种经典的组合优化问题。在FJSP问题中,有多个作业需要在多个机器上进行加工,每个作业由一系列工序组成,每个工序需要在特定的机器上完成。同时,每个机器一次只能处理一个工序,且每个工......
  • FJSP:霸王龙优化算法(Tyrannosaurus optimization,TROA)求解柔性作业车间调度问题(FJSP),提供
    一、柔性作业车间调度问题柔性作业车间调度问题(FlexibleJobShopSchedulingProblem,FJSP),是一种经典的组合优化问题。在FJSP问题中,有多个作业需要在多个机器上进行加工,每个作业由一系列工序组成,每个工序需要在特定的机器上完成。同时,每个机器一次只能处理一个工序,且每个工......
  • 异或运算在算法中的神奇应用
    1.什么是异或两个二进制数进行异或运算时,每一位上的数相同则结果为0,不同则结果为1。示例:6^7=?转化成二进制:6=1107=1116^7=110^111=001=1简单记:异或就是二进制的无进位相加。还有个同或运算:相同为1,不同为0,和异或是反的。2.异或运算的特性任何数与0异或,结果还是这......
  • 【MATLAB源码-第171期】基于matlab的布谷鸟优化算法(COA)无人机三维路径规划,输出做短路
    操作环境:MATLAB2022a1、算法描述布谷鸟优化算法(CuckooOptimizationAlgorithm,COA)是一种启发式搜索算法,其设计灵感源自于布谷鸟的独特生活习性,尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中的行为特点,为解决各种复杂的优化问题提供了一种新颖的方法。从算法......
  • 17天【代码随想录算法训练营34期】第六章 二叉树part04(● 110.平衡二叉树 ● 257.
    110.平衡二叉树#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defgetDepth(self,root):......