📄 heapfunction.cpp
字号:
#include "heap.h"
//构建大顶堆
void HeapBottomUP(Array *H){
int i,j,k,v;
bool heap;
for(i=(*H).len/2-1;i>=0;i--){
k=i;v=(*H).a[k];//v要放在最终位置
heap=false;
while( !heap && 2*k+2<(*H).len ){
j=2*k+2;
if(j<(*H).len)//有两个孩子
if((*H).a[j-1]>(*H).a[j])
j-=1;
if(v>=(*H).a[j])
heap=true;
else{
(*H).a[k]=(*H).a[j];
k=j;
}
}//while
(*H).a[k]=v;
}//for
}
//堆排序
void HeapSort(Array *H){
int i,j,k,v;
bool heap;
for(i=(*H).len-1;i>0;i--){
v=(*H).a[i];
(*H).a[i]=(*H).a[0];
heap=false;
j=0;
while( !heap && 2*j+1<i){
k=j;
j=2*k+2;
if(j<i ){
if( (*H).a[j-1] >(*H).a[j] )
j-=1;
}else{
if(i==1){
j=0;
heap=true;
break;
}
else j-=1;
}
if(v<(*H).a[j])
(*H).a[k]=(*H).a[j];
else {
heap=true;
}
}//
if(heap)
(*H).a[k]=v;
else (*H).a[j]=v;
}//for
}
//输入待排序数据
void Input(Array *H){
printf("请输入待排序数的个数(小于%d):\n",MAX);
scanf("%d",&(*H).len);
int i;
for(i=0;i<(*H).len;i++)
scanf("%d",&((*H).a[i]));
}
void AutoData(Array *H){
printf("请输入待排序数的个数(小于%d):",MAX);
scanf("%d",&(*H).len);
int i;
srand( (unsigned int)time(0) );
for(i=0;i<(*H).len;i++)
(*H).a[i]=rand()%50;
}
//输出排序结果
void Output(Array H){
int i;
for(i=0;i<H.len;i++)
printf("%-3d",H.a[i]);
printf("\n");
}
void HeapStart(){
Array H;
char c;
int k;
begin:
system("cls");
printf("选择工作方式(1 手动输入 2 自动产生数据):\n");
scanf("%d",&k);
if(k==1)
Input(&H);
else
AutoData(&H);
printf("排序前:\n");
Output(H);
HeapBottomUP(&H);
HeapSort(&H);
printf("排序后:\n");
Output(H);
printf("继续测试?(y/n)");
while( getchar()!='\n' );
c=getchar();
if(c=='y')
goto begin;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -