?? 堆排序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 + -