DS内排—堆排序

2023-07-30 13:43:14 浏览数 (1)

题目描述

给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。

输入

数据个数n,n个整数数据

输出

初始创建的小顶堆序列

每趟交换、筛选后的数据序列,输出格式见样例

输入样例1 

8 34 23 677 2 1 453 3 7

输出样例1

8 1 2 3 7 23 453 677 34 8 2 7 3 34 23 453 677 1 8 3 7 453 34 23 677 2 1 8 7 23 453 34 677 3 2 1 8 23 34 453 677 7 3 2 1 8 34 677 453 23 7 3 2 1 8 453 677 34 23 7 3 2 1 8 677 453 34 23 7 3 2 1

思路分析

首先要建立一个小顶堆,建立堆的过程是一个反复筛选的过程。

一个筛选的过程是一个自堆顶到叶子的调整过程,排序原理就是输出堆顶元素,然后把堆的最后一个元素移到堆顶,然后重新调整使之重新成为一个堆。这样一个调整的过程,在建立堆的时候需要从第n/2个元素开始反复调整。

AC代码

代码语言:javascript复制
#include<iostream>
using namespace std;
class MinHeap{
    int data[256],n;
public:
    MinHeap(){
        cin>>n;
        for(int i=0;i<n;i  )
            cin>>data[i];
        for(int i=n/2;i>=0;i--)
            Adjust(i,n-1);
        Show();
        HeapSort();
    }
    void Adjust(int i,int m){
        int temp=data[i];
        for(int j=2*i 1;j<=m;j=j*2 1){
            if(j<m&&data[j]>data[j 1])
                j  ;
            if(data[j]>=temp)
                break;
            data[i]=data[j];
            i=j;
        }
        data[i]=temp;
    }
    void HeapSort(){
        for(int i=n-1;i>0;i--){
            swap(data[0],data[i]);
            Adjust(0,i-1);
            Show();
        }
    }
    void Show(){
        cout<<n<<' ';
        for(int i=0;i<n-1;i  )
            cout<<data[i]<<' ';
        cout<<data[n-1]<<endl;
    }
};
int main() {
    MinHeap test;
}

0 人点赞