📄 堆排序1dlg.cpp
字号:
ciwei=k+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.MoveTo(lie,hang);
j=2*k;
cihang=log10(j)/log10(2)+1;
ciwei=j+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.LineTo(lie,hang);
cihang=log10(k)/log10(2)+1;
ciwei=k+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.MoveTo(lie,hang);
if((2*k+1)<=m_nowlen)
{
j=2*k+1;
cihang=log10(j)/log10(2)+1;
ciwei=j+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.LineTo(lie,hang);
}
}
m_luojihang=1;
}
}
void CMy1Dlg::OnButton5()
{
int i,j,k;
CString string;
m_h.length=m_KeyNum;
for(i=1;i<=m_h.length;i++)
m_h.r[i].key=m_RealKey[i-1];
m_yipaixu="";
Headsort();
UpdateData(FALSE);
int cihang;int ciwei;int fenwei;
int hang,lie;
m_nowlen=m_h.length;
m_luojihang=log10(m_nowlen)/log10(2)+1;
float asd;
///////////////////////////////////////////// 对调
for(i=1;i<=m_h.length/2;i++)
{
asd=m_h.r[i].key;
m_h.r[i]=m_h.r[m_h.length-i+1];
m_h.r[m_h.length-i+1].key=asd;
}
m_number=m_h.r[1].key;
UpdateData(FALSE);
/////////////////////////////////////////// 输出 ipaixu
for(i=1;i<=m_KeyNum;i++)
for(j=0;j<m_KeyNum;j++)
if(m_h.r[i].key==m_RealKey[j])
{
m_Keylist.GetText(j,string);
m_yipaixu=m_yipaixu+" ";
m_yipaixu=m_yipaixu+string;
}
/////////////////////////////////////// 图显 1 到最后 ,顺序
for(i=1;i<=m_nowlen;i++)
{
cihang=log10(i)/log10(2)+1;
ciwei=i+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
CClientDC dc(this);
dc.RoundRect(lie-17,hang,lie+17,hang+20,5,5);
for(j=0;j<m_KeyNum;j++)
if(m_h.r[i].key==m_RealKey[j])
m_Keylist.GetText(j,string);
dc.DrawText(string,CRect(lie-15,hang,lie+15,hang+20),DT_CENTER);
for(k=1;k<=m_nowlen/2;k++)
{
cihang=log10(k)/log10(2)+1;
ciwei=k+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.MoveTo(lie,hang);
j=2*k;
cihang=log10(j)/log10(2)+1;
ciwei=j+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.LineTo(lie,hang);
cihang=log10(k)/log10(2)+1;
ciwei=k+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
UpdateData(FALSE);
dc.MoveTo(lie,hang);
if((2*k+1)<=m_nowlen)
{
j=2*k+1;
cihang=log10(j)/log10(2)+1;
ciwei=j+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.LineTo(lie,hang);
}
m_adjtime=0;
KeyNum=1;
UpdateData(FALSE);
}
}
UpdateData(FALSE);
}
void CMy1Dlg::Headsort()
{
int i;
float bri; //bri为将要用到的中间变量;
for(i=m_h.length/2;i>0;--i) //对初始的对进行筛选,从最后一个非终端节点开始
HeadAdjust(i,m_h.length); //往前进行调整,使之成为一个小顶堆;
for(i=m_h.length;i>1;--i)
{
bri=m_h.r[1].key; //将堆顶元素与当前数组最后一个元素
m_h.r[1]=m_h.r[i]; //互换位置,得到一个有序的元素,
m_h.r[i].key=bri; //其位置放在当前无序数组的后一个位置上;
HeadAdjust(1,i-1);
}
}
void CMy1Dlg::HeadAdjust(int s, int m)
{ float rc;
int j; //满足堆的定义,则此函数将对堆进行调整,
//使其重新成为一个小顶堆;
rc=m_h.r[s].key; //将h.r[s].key的值赋予变量rc;
for(j=2*s;j<=m;j*=2)
{ //从2S至m的范围内找最小的关键字,将下标记为j;
if((j<m)&&(m_h.r[j].key>m_h.r[j+1].key)) ++j;
if(!(rc>m_h.r[j].key)) break; //判断r[rc].key与r[j].key的大小,将较小的赋予r[s];
m_h.r[s]=m_h.r[j];
s=j;
}
m_h.r[s].key=rc;
}
void CMy1Dlg::OnButton3()
{
m_Key.Empty();
//m_Jieguo.ResetContent();
m_number=0;
// OnButton1();
//m_Jieguo.ResetContent();
m_yipaixu="";
m_luojihang=0;
m_Keylist.ResetContent();
CClientDC dc(this);
dc.Rectangle(225,194,639,421);
UpdateData(FALSE);
}
void CMy1Dlg::OnButton4()
{
float bri;
int i,j;
CString string;
// m_Jieguo.ResetContent();
if(m_adjtime==0)
{ if(m_luojihang==0) AfxMessageBox("请先输入数据");
else
{CClientDC dc(this);
if(KeyNum!=1)dc.Rectangle(225,194,639,421);
MessageBox("堆排序已经结束!\n 请重新开始");
}
}
else{
bri=m_h.r[1].key;
m_h.r[1]=m_h.r[m_adjtime];
m_h.r[m_adjtime].key=bri;
HeadAdjust(1,m_adjtime-1);
CClientDC dc(this);
dc.Rectangle(225,194,639,421);
//////////////////////////////////显示排序结果 m_h.r[i] 数组
m_number=m_adjtime;
UpdateData(FALSE);
for(i=1;i<=m_h.length;i++)
if(m_h.r[m_adjtime].key==m_RealKey[i-1])
{
m_Keylist.GetText(i-1,string);
m_yipaixu=m_yipaixu+" "+string;
}
UpdateData(FALSE);
//////////////////////////////格式输出
int cihang;int ciwei;int fenwei;
int hang,lie;
m_nowlen=m_adjtime;
m_luojihang=log10(m_nowlen)/log10(2)+1;
for(i=1;i<=m_nowlen;i++)
{
cihang=log10(i)/log10(2)+1;
ciwei=i+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
CClientDC dc(this);
dc.RoundRect(lie-17,hang,lie+17,hang+20,5,5);
for(j=0;j<m_KeyNum;j++)
if(m_h.r[i].key==m_RealKey[j])
m_Keylist.GetText(j,string);
dc.DrawText(string,CRect(lie-15,hang,lie+15,hang+20),DT_CENTER);
for(int k=1;k<=m_nowlen/2;k++)
{
cihang=log10(k)/log10(2)+1;
ciwei=k+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.MoveTo(lie,hang);
j=2*k;
cihang=log10(j)/log10(2)+1;
ciwei=j+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.LineTo(lie,hang);
cihang=log10(k)/log10(2)+1;
ciwei=k+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.MoveTo(lie,hang);
if((2*k+1)<=m_nowlen)
{
j=2*k+1;
cihang=log10(j)/log10(2)+1;
ciwei=j+1-pow(2,cihang-1);
fenwei=pow(2,cihang-1);
hang=200+50*(cihang-1);
lie=230+(410/fenwei)*(ciwei-1)+(410/fenwei)/2;
dc.LineTo(lie,hang);
}
}
}
m_adjtime--;
}
}
void CMy1Dlg::OnButton7()
{
m_Key.Empty();
//m_Jieguo.ResetContent();
m_number=0;
//OnButton1();
//m_Jieguo.ResetContent();
m_yipaixu="";
m_adjtime=0;
m_luojihang=0;
m_Keylist.ResetContent();
CClientDC dc(this);
dc.Rectangle(225,194,639,421);
UpdateData(FALSE);
}
void CMy1Dlg::OnButton8()
{
OnButton1();
KeyNum=0;
UpdateData(FALSE);
}
void CMy1Dlg::OnButton6()
{
CString string;
string =" 首先,在“请输入数据”输入关键字。关键字的类型可以是整形或者是浮点型,每两个关键字之间用空格隔开。\r\n\n输入其它字符将被视为非法输入。也可以点击“默认输入按钮”,输入一组默认的关键值。点击输入确认按钮。\n\n\r 之后在“获取的关键字”处,将显示刚刚输入的关键字。在“当前堆显示处”,将显示一个经过第一次筛选后\n\n\r的堆。\n\n\r 这时,可以点击“进行一次筛选”按钮,将对当前的堆进行一次筛选,得到一个有序的关键字。得到的关键字将\n\n\r在“已经有序的关键字处”显示。当前的堆也将发生变化。再次点击“进行一次筛选”按钮,不断地对当前的堆进行\n\n\r筛选,将最终得到所有有序的关键字。\r\n\n 也可以在点击“输入确认之后”,直接点击“最终排序结果”按钮,直接得到结果。\n\n\r 点击“重新排序”,将对已经获取的关键字进行重新的排序,当前的堆将恢复到起始时的堆。\n\n\r 点击“重启程序”将清除以获取的关键字,需要重新输入关键字进行排序。\n\n\r 点击“退出”或者“确定”结束程序。";
MessageBox(string);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -