⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 堆排序1dlg.cpp

📁 这是用VC++做的一个堆排序的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -