用vc執行緒模擬實現並行演算法 (轉)

worldblog發表於2007-12-14
用vc執行緒模擬實現並行演算法 (轉)[@more@]

題目如下:令n=2的m次方,A是一個2n維的陣列,待求最大值的數存放在A(n),A(n+1),……A(2n-1)中,所求得的最大值置於A(1),於是演算法描述如下:

  輸入:n=2的m次方個數存在陣列A(n;2n-1)中;

  輸出:最大數置於A(1)中。:namespace prefix = o ns = "urn:schemas--com::office" />

Begin
For k=m-1 to 0 do
  For j=2k+1-1 to 2k par do
  A(j)=max(A(2j),A(2j+1))
  End For
End For
End

具體實現:

  定義全域性變數如下,array用於存放產生的隨機數。

int g_nCount=0,j=0;
int *array;

  隨機產生n個數並存於陣列array中,程式碼如下:

void CDemoDlg::OnBtnInitial()
{
 // 初始化陣列

 srand((unsigned)time(NULL));
 int i,temp;
 CString str;
 UpdateData(true);
 g_nCount=pow(2,m_intCount);
 array=new int[2*g_nCount];
 //根據的輸入,產生2的m次方的隨機數並存於array[n]…a[2n-1]中
 for(i=g_nCount;i<2*g_nCount;i++)
 {

  temp=rand()/100;
  array[i]=temp;
 }
 //顯示產生的n個隨機數
 for(i=g_nCount;i<2*g_nCount;i++)
 {
  str.Format("Array[%d]= %d",i,array[i]);
  m_strArray+="rn";
  m_strArray+= str;
  m_strArray+="rn";
 }
 m_strArray+="rn";
 UpdateData(false);

}

void CDemoDlg::OnBtnCompute()
{
 // 啟動執行緒進行計算
 int k;
 for(k=m_intCount-1;k>=0;k--)
 {
  for(j=pow(2,k);j  {
   AfxBeginThread(ComputeThread,GetSafeHwnd(),
   THREAD_PRIORITY_NORMAL);
  }

 }
 //執行緒體:較array[2j]與array[2j+1]的大小,將大值置於array[j]中
 UINT ComputeThread(LPVOID pParam)
 {
  if(array[2*j]>=array[2*j+1])
  {
   array[j]=array[2*j];
  }
  else
  {
   array[j]=array[2*j+1];
  }
  return 0;

 }
}
//顯示計算結果
void CDemoDlg::OnBtnShow()
{
 // TODO: Add your control notification handler code here
 int k;
 CString str;
 for(k=1;k<2*g_nCount;k++)
 {
  str.Format("Array[%d]= %d",k,array[k]);
  m_strArray+="rn";
  m_strArray+= str;
  m_strArray+="rn";
 }

 UpdateData(false);
}
重置功能的實現程式碼,主要是將陣列清空:
void CDemoDlg::OnBtnClear()
{
 // TODO: Add your control notification handler code here
 m_strArray.Empty ();
 m_ctrlCount.SetFocus();
 m_ctrlCount.Clear();
 m_ctrlCount.SetSel(1);

 UpdateData(false);

 g_nCount=0;
 j=0;

}

  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993346/,如需轉載,請註明出處,否則將追究法律責任。

相關文章