设一组记录的关键字序列为(51、85、61、43、45、49),采用堆排序算法完成以下操作
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/10 21:01:29
设一组记录的关键字序列为(51、85、61、43、45、49),采用堆排序算法完成以下操作
(要求小根堆,并画出中间过程)
1、以二叉树描述6个元素的初始堆
2、以二叉树描述逐次取走堆顶元素后,经调整得到的5个元素、4个元素的堆
(要求小根堆,并画出中间过程)
1、以二叉树描述6个元素的初始堆
2、以二叉树描述逐次取走堆顶元素后,经调整得到的5个元素、4个元素的堆
这是我写的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);
}
}
#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);
}
}
设一组记录的关键字序列为(51、85、61、43、45、49),采用堆排序算法完成以下操作
数据结构 堆排序设一组记录关键字序列为(80,70,33,65,24,56,48),则用筛选法建成的初始堆为
已知关键字序列(56,30,71,29,97,83,74,64,76,48),采用堆排序算法进行递增排序,给出前5各趟排
设有一组关键字序列(34,76,45,18,26,54,92),则由这组记录关键字生成的二叉排序树的深度为()
设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出成功查找时的平均查找长度.
数据结构问题:设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出成功查找时的平均查
采用快速排序算法,对关键字序列(28,56,78,60,12,25)按从小到大次序排序
对一组记录的关键码为(46,79,56,38,40,84),如果采用堆排序方法,则建立的初始堆是?
堆排序问题一组记录的关键码为146,79,56,38,40,84采用堆排序,则初始堆化后最后一个元素师是几?答案说是14
一组记录的关键字为(52,56,26,12,69,85,33,48,70),给出快速排序的过程.
求数据结构算法?求“假设有 1000个关键字为小于10000的整数的记录序列,请编写一种排序算法,要求以尽可能少的比较次
数据结构 习题:对于存储在顺序表中的关键字序列(12,13,11,18,60,15,7,18,25,90)采用堆排序