堆排序 heapsort

//问题 A DS内排—堆排序.cpp:此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

//#include "pch.h"
#include <iostream>
#include<iostream>
using namespace std;

void heapAdjust(int arr[],int s,int m)
{
	int j;
	
	for (j = 2 * s; j <=m; j *=2)    //s节点是根节点
	{
		if (j<m && arr[j]>arr[j + 1])  //大于号或小于来决定小顶堆或者大顶堆,就是找到左右节点里的大的或小的节点。
			j++;
		if (arr[s]<=arr[j])    //这里是小顶堆,如果根节点就是最小的话,不需要交换,直接break出循环。
			break;
		swap(arr[s],arr[j]);
		s = j;       //继续交换。
	}
	
}


void print(int arr[], int n)
{
	cout << n;
	for (int i = 1; i <= n; i++)
		cout << " " << arr[i];
	cout << endl;
}

void heapSort(int arr[],int n)  
{
	int i;
	for (i =n/2;i>0; i--)         //只需要考虑树的非叶子节点即可,因为建堆的时候要考虑孩子节点,考虑叶子节点没有意义,因此从n/2开始。
		heapAdjust(arr,i,n);      //把乱序的二叉树变成大顶堆或者小顶堆(大或者小顶对由题目来定,在heapAdjust函数内部考虑。)
	print(arr,n);

	for (i = n; i >1; i--)
	{
		swap(arr[1],arr[i]);  //交换根节点(最大或者最小)和最后一个节点。
		heapAdjust(arr,1,i - 1);  //把除了最后一个节点以外的节点重新建成堆。
		print(arr,n);
	}
}

int main()
{
	int n;
	cin >> n;
	int arr[100];
	for (int i = 1; i <=n; i++)   //从0开始和从1开始都一样,只要注意在通过双亲节点来找子节点的时候的公式就行。
		cin >> arr[i];
	heapSort(arr, n);
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值