作业帮 > 综合 > 作业

设一组记录的关键字序列为(51、85、61、43、45、49),采用堆排序算法完成以下操作

来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/10 21:01:29
设一组记录的关键字序列为(51、85、61、43、45、49),采用堆排序算法完成以下操作
(要求小根堆,并画出中间过程)
1、以二叉树描述6个元素的初始堆
2、以二叉树描述逐次取走堆顶元素后,经调整得到的5个元素、4个元素的堆
设一组记录的关键字序列为(51、85、61、43、45、49),采用堆排序算法完成以下操作
这是我写的C++代码的简单实现
#include<iostream>
using namespace std;
int parent(int i);
int left_child(int i);
int right_child(int i);
void max_heapify(int a[],int i,int heap_size);
void build_max_heap(int a[],int heap_size);
void heap_sort(int a[],int heap_size);
int main()
{
\x05int a[]={51,85,61,43,45,49};
\x05int i;
\x05for(i=0;i<=5;i++){
\x05\x05cout<<" ";cout<<a[i];cout<<" ";}
\x05\x05cout<<endl;
\x05heap_sort(a,5);
\x05for(i=0;i<=5;i++){
\x05\x05cout<<" ";cout<<a[i];cout<<" ";}
\x05\x05cout<<endl;
}
int parent(int i){
\x05\x05return i/2;
}
int left_child(int i){
\x05\x05return 2*i;
}
int right_child(int i){
\x05\x05return 2*i+1;
}
void max_heapify(int a[],int i,int heap_size){
\x05\x05int largest;
\x05\x05int n;
\x05\x05int l=left_child(i);
\x05\x05int r=right_child(i);
\x05\x05if((l<=heap_size)&&(a[l]>a[i]))
\x05\x05\x05largest=l;
\x05\x05else
\x05\x05\x05largest=i;
\x05\x05if((r<=heap_size)&&(a[r]>a[largest]))
\x05\x05\x05largest=r;
\x05\x05if(largest!=i){
\x05\x05\x05n=a[largest];
\x05\x05\x05a[largest]=a[i];
\x05\x05\x05a[i]=n;
\x05\x05max_heapify(a,largest,heap_size);
}}
\x05\x05
void build_max_heap(int a[],int heap_size){
\x05        int i;\x05
\x05\x05for(i=heap_size/2;i>=0;i--)
\x05\x05\x05max_heapify(a,i,heap_size);
}
void heap_sort(int a[],int heap_size){
\x05\x05int i,n;
\x05\x05build_max_heap(a,heap_size);
\x05\x05for(i=heap_size;i>=1;i--){
\x05\x05\x05n=a[i];
\x05\x05\x05a[i]=a[0];
\x05\x05\x05a[0]=n;
\x05\x05\x05heap_size--;
\x05\x05\x05max_heapify(a,0,heap_size);
}
}