问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

计算机C语言的堆排序原理,最好是一个排序的例子,举数据进行现场排序

发布网友 发布时间:2022-04-30 16:13

我来回答

2个回答

热心网友 时间:2022-06-27 04:46

#include<stdio.h>
#define N 6
int j,k;
//建堆函数
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("%d ",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");
}
//打印排序好地数组
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("%d ",a[i]);
printf("\n");
}
int main(){
int a[50];
int i;
int tmp;
int sum;
int len;
printf(" 堆排序\n");
printf("\n=============================================\n");
printf("\n请输入堆排序的数组元素个数,回车结束:\n");
scanf("%d",&len);
printf("\n请输入待排序的数组以回车结束:\n");
for(i=0;i<len;i++)
scanf("%d",&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");
return 0;
}

热心网友 时间:2022-06-27 04:46

#include <stdio.h>
void swap(int* a, int* b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void maxHeapify(int* a, int i, int n)
{
int l, r, m;
do{
r = (i+1) << 1;
l = r - 1;
m = l < n && a[l] > a[i] ? l : i;
m = r < n && a[r] > a[m] ? r : m;
if(i != m) swap(a+i, a+m), i = m;
else break;
}while(1);
}
void heapSort(int* a, int n){
int i;
for(i = (n-1)/2; i >= 0; --i)
maxHeapify(a, i, n);
for(i = n-1; i > 0; --i)
{
swap(a, a+i);
maxHeapify(a, 0, --n);
}
}
void print(int* a, int* b)
{
while(a < b)
printf("%d ", *a++);
putchar('\n');
}
int main(){
int a[10] = {6,3,1,9,7,4,0,5,8,2};
heapSort(a, 10);
print(a, a+10);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? C语言堆排序 几个不明白的地方。高手帮忙啊!~ c语言中 堆怎么理解? 05718295是哪的催收电话? 0215164是什么催收电话? 05198210是什么催收电话? 鱼刺卡在喉咙下方有危险吗 昨天晚上吃鱼刺被卡在右侧喉咙咽不下去喝水也下不去吃饭也咽不下 我要入团。 入团还要戴红领巾 怎么戴啊!! 我想入团! 格式工厂怎么横屏转竖屏? 入团志愿书证件上贴的照片可以用纸质的嘛 入团还要戴红领巾怎么戴啊!! 入团志愿书填写样本2017 我长期在线请问怎么入团啊。。加不了啊 。,。。 铁胆的电饭煲会不会笨重不好看?九阳的铁釜电饭煲怎么样? 这种入团志愿书的里面内容图片,要空白,可供打印。 团员证图片几寸什么底 入共青团 照片的要求 铁胆电饭煲选什么牌子的? 05718519是什么催收电话? 心身疾病的名词解释 C语言中建堆排序是怎么排的? 心身疾病名词解释 0539-3836380是什么催收电话? 学前卫生学名词解释是什么? 什么叫心理障碍 C语言的堆排序算法 呼吸不畅,胸闷怎么回事? 0719804是什么催收电话? 谁有2019心理卫生与心理辅导自考题?急求救 简述康复心理对治疗师角色的要求 什么是亚健康?名词解释 谁有2013心理卫生与心理辅导自考题?急……求救 寻医学遗传学和医护心理学形成性考核册完整答案,急! 护理工作中的“三查八对一注意”是什么意思? 手机视频传到电脑用会声会影打开是竖屏的,怎么调整成横屏的 情志相胜法什么意思 用手机竖屏拍摄的视频,在电脑上是歪的如何正过来 为什么在手机上竖屏拍摄的视频在电脑上播放是横屏的?还无法旋转。