国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:25:48
字體:
來源:轉載
供稿:網友
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 ;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扬州市| 余干县| 高安市| 大悟县| 普兰县| 兖州市| 孟津县| 凤翔县| 长沙县| 辉县市| 呼伦贝尔市| 洛阳市| 温州市| 含山县| 济南市| 定西市| 莎车县| 武穴市| 天台县| 鹤壁市| 榆林市| 洪雅县| 临城县| 富平县| 瑞昌市| 甘孜县| 天祝| 承德县| 瑞金市| 庄河市| 平阳县| 大同市| 本溪| 托里县| 镇巴县| 四平市| 三原县| 柯坪县| 阜康市| 洛南县| 福泉市|