//问题 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);
}
堆排序 heapsort
最新推荐文章于 2024-05-19 17:08:00 发布