C# 實現常用的演算法-- 堆排序

來源:互聯網
上載者:User
排序|演算法 5. 堆排序

  5.1. 基本思想:

  堆排序是一樹形選擇排序,在排序過程中,將R[1..N]看成是一顆完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係來選擇最小的元素。

  5.2. 堆的定義:

  N個元素的序列K1,K2,K3,...,Kn.稱為堆,若且唯若該序列滿足特性:Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])。


  堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉子結點的關鍵字均大於等於其孩子結點的關鍵字。例如序列10,15,56,25,30,70就是一個堆,它對應的完全二叉樹如上圖所示。這種堆中根結點(稱為堆頂)的關鍵字最小,我們把它稱為小根堆。反之,若完全二叉樹中任一非葉子結點的關鍵字均大於等於其孩子的關鍵字,則稱之為大根堆。

  5.3. 排序過程:

  堆排序正是利用小根堆(或大根堆)來選取當前無序區中關鍵字小(或最大)的記錄實現排序的。我們不妨利用大根堆來排序。每一趟排序的基本操作是:將當前無序區調整為一個大根堆,選取關鍵字最大的堆頂記錄,將它和無序區中的最後一個記錄交換。這樣,正好和直接選擇排序相反,有序區是在原記錄區的尾部形成並逐步向前擴大到整個記錄區。

  【樣本】:對關鍵字序列42,13,91,23,24,16,05,88建堆。

 
 


  5.4. 程式實現

/// <summary>
/// 小根堆排序
/// </summary>
/// <param name="dblArray"></param>
/// <param name="StartIndex"></param>
/// <returns></returns>

private static void HeapSort(ref double[] dblArray )
{
 for(int i = dblArray.Length -1 ; i >= 0; i--)
 {
  if(2*i+1<dblArray.Length)
  {
   int MinChildrenIndex = 2*i+1 ;
   //比較左子樹和右子樹,記錄最小值的Index
   if(2*i+2 < dblArray.Length )
   {
    if(dblArray[2*i+1]>dblArray[2*i+2])
     MinChildrenIndex = 2*i+2;
   }
   if(dblArray[i] > dblArray[MinChildrenIndex])
   {
    ExchageValue(ref dblArray[i],ref dblArray[MinChildrenIndex]);
    NodeSort(ref dblArray ,MinChildrenIndex);
   }
  }
 }
}

/// <summary>
/// 節點排序
/// </summary>
/// <param name="dblArray"></param>
/// <param name="StartIndex"></param>

private static void NodeSort(ref double[] dblArray,int StartIndex)
{
 while(2*StartIndex+1 < dblArray.Length)
 {
  int MinChildrenIndex = 2*StartIndex+1 ;
  if(2*StartIndex+2 < dblArray.Length )
  {
   if(dblArray[2*StartIndex+1]>dblArray[2*StartIndex+2])
   {
    MinChildrenIndex = 2*StartIndex+2;
   }
  }
  if(dblArray[StartIndex] > dblArray[MinChildrenIndex])
  {
   ExchageValue(ref dblArray[StartIndex],ref dblArray[MinChildrenIndex]);
   StartIndex = MinChildrenIndex ;
  }
 }
}

/// <summary>
/// 交換值
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>

private static void ExchageValue(ref double A , ref double B)
{
 double Temp = A ;
 A = B ;
 B = Temp ;
}



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.