问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

c++堆排序的代码及讲解

提问网友 发布时间:2022-04-23 03:17
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
3个回答
热心网友 回答时间:2022-05-07 19:37
#include<iostream>
using namespace std;
#define N 6
int k,j;
/* 建堆函数 */
void build(int *a,int i,int n)
{
int tmp;
k=i;
j=2*k+1;
while(j<=n){
if(j<n && a[j]<a[j+1])
j++;
if(a[k]>=a[j])break;
tmp=a[k];
a[k]=a[j];
a[j]=tmp;
k=j;
j=2*j+1;
}
}
/* 打印数组函数 */
void prnt(int *a,int n){
int i;
printf("\n");
for(i=0;i<n;i++){
printf("%3d",a[i]);
}
printf("\n");
}
/* 打印堆函数 */
void prnthp(int *a,int b1,int b2){
int size;
int h=0,sum=0,item=1;
int i,j,cnt,start,tmp;
size=b2-b1+1;
while(sum<=size){
sum+=item;
h++;
item*=2;
}
item=1;
cnt=0;
start=b1;
tmp=1;
printf("\n--------------------------------------------\n");
printf(" 堆:\n");
while(1){
for(i=0;i<h;i++){
for(j=0;j<h-i;j++)
printf(" ");
for(j=0;j<i+1;j++)printf(" ");
for(j=0;j<tmp;j++){
if(cnt>size-1)goto end;
printf("%4d",a[cnt++]);
}
printf("\n");
tmp*=2;
}
}
end:
printf("\n");
return;
}
/* 打印已排序数组函数 */
void prntar(int *a,int b2,int len){
int i;
printf(" 已排序:\n");
for(i=0;i<b2;i++){
printf(" ");
}
for(i=b2;i<=len;i++){
printf("%3d",a[i]);
}
printf("\n");
}
main(){
/* int a[]={-1,2,5,1,0,-3,-2,8,6}; */
int a[50];
int i;
int tmp;
int sum;
int num;
int len;
printf(" 堆排序\n");
printf("\n============================================\n");
printf("\n 请输入待排序数组个数,以回车结束:\n");
scanf("%3d",&len);
printf("\n 请输入待排序数组,以回车结束:\n");
for(i=0;i<len;i++)
scanf("%3d",&a[i]);
tmp=1;sum=0;
while(sum+tmp<=len){
sum+=tmp;
tmp*=2;
}
printf("\n============================================\n");
printf("\n 初始数组: \n");
prnt(a,len);
/* 建初始堆 */
for(i=sum-1;i>=0;i--)
build(a,i,len-1);
prnthp(a,0,len-1);
/* 改建堆 */
for(i=0;i<len-1;i++){
tmp=a[0];
a[0]=a[len-1-i];
a[len-1-i]=tmp;
build(a,0,len-2-i);
prnthp(a,0,len-2-i);
prntar(a,len-1-i,len-1);
}
printf("\n--------------------------------------------\n");
printf("\n 排序结果:\n");
prnt(a,len);
printf("\n============================================\n\n");
getch();
}
热心网友 回答时间:2022-05-07 20:55
堆排序算法(C++描述)

void HeapSort(SeqIAst R)
{ //对R[1..n]进行堆排序,不妨用R[0]做暂存单元
int i;
BuildHeap(R); //将R[1-n]建成初始堆
for(i=n;i>1;i--)
{
//对当前无序区R[1..i]进行堆排序,共做n-1趟。
R[0]=R[1];
R[1]=R[i];
R[i]=R[0];//将堆顶和堆中最后一个记录交换
Heapify(R,1,i-1);
//将R[1..i-1]重新调整为堆,仅有R[1] 可能违反堆性质
} //endfor
}
//HeapSort

参考资料:http://ke.baidu.com/view/157305.htm?fr=ala0_1_1

热心网友 回答时间:2022-05-07 22:30
你先说你明白堆排序是怎么回事吧。这种中级水平的东西不是弄套代码看看注释就能明白的。当然无论如何不用指望我给你讲,我懒...

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

堆排序最开始定义的那几个变量代表什么意思? 数据结构(C语言版) 堆排序 在堆排序的过程中为什么要从n/2到1的顺序进行建堆过程而不是反过来... 堆排序的用途 数据结构的堆排序 C语言堆排序法谁能通俗易懂又清晰地讲解一下?谢谢 计算机的相关知识,堆排序是指什么? 华为手机微信怎么隐身登录 微信可以隐身登录吗? 刺激战场吃鸡怎么让微信好友看不到?吃鸡对好友隐身的方法 刺激战场隐身登录问题 和平精英可以隐身登陆吗? 华为mate40pro玩吃鸡怎么把微信隐身? 什么叫与人为善? &quot;与人为善&quot;的成语有哪些? 如何做到与人为善? 与人为善 出处? 孟子“与人为善”的思想内涵? 与人为善是什么意思 与人为善讲了些什么? 为什么在平均情况下,快速排序比堆排序要优秀? 这样一组数 45 28 49 16 37 82 56 75初始堆后,利用堆排序怎么排... 急急!请问,序列 {29.70.54.32.64.78}使用最小堆的堆排序方法排序每一趟的排序结果 c++堆排序怎么知道排序后的数原来的下标 “二分法插入排序”、“快速排序”、“归并排序”和“堆排序”的时间复杂度分别是多少? 跨行跨地域转账手续费怎么收?从交通银行转账500块钱到外地的农行,大概... 交通银行异地跨行转账要手续费多少 交通银行 跨行异地转账手续费多少 交通银行跨行转账手续费到底多少?比如转200,500,1000,2000分别多少 交通银行跨行异地转账手续费多少 交通银行网银跨行跨区域转账手续费怎么收的啊 请问交行省内异地跨行转账或汇款,手续费多少。 交行网上银行跨行转帐手续费是多少?能立刻到帐么? 交通银行卡异地跨行转账手续费多少??1万元 交行异地跨行转账手续费 交行沃德客户条件和待遇 现在交通银行跨行转账收费吗? 交通银行跨省转账的手续费是多少?(大概) 交通银行沃德卡的年费是多少 交行沃德卡一年刷6次免年费吗
Top