最大堆排序

2021-12-29 20:35:59 字數 2217 閱讀 1336

其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子

節點都小於父節點。我使用的是陣列的實現方式,

parent(i): return (i/2); //i的父節點下標,

left(i): return 2*i; //i的左子節點

right(i): return 2*i+1; //i的右子節點.

以上均為陣列元素的標號位置,在訪問元素時候,需要減一的。

舉乙個例子:

共六個節點。在陣列中儲存,每乙個的編號如下:

|1 | 2 | 3 | 4 | 5 | 6 |

二叉樹的結構為

2   3

4 5 6

我使用的是遞迴的方法。

我首先從1節點開始遞迴。發現1節點的2、3子節點都有子節點,依次遞迴2,3。

2節點的子節點4、5沒有子節點,對2、4、5進行堆排序。然後返回。

3節點的子節點6沒有子節點,對3、6進行堆排序。然後返回。

1、2、3進行堆排序。首次堆排序完成。

1節點將是所有結果中的最值(最大或最小值)

然後將排序的資料減一,陣列開始指標向後移動一位,返回第一步。直到排序資料為零。

(其實也可一將第乙個資料,與最後乙個資料交換,將要排序的資料減一,返回第一步也行的。)

下面是我寫的**,我在ubuntu中測試通過。與書中的方案不同,可能非最優方案,請大家諒解。一下是**。

[cpp]

/**main function:maximum heap sort

*author:reage

*blog:

*/ #include   

#include     

/*swap *p1 and p2 value

*/ void swap(int *p1, int * p2)   

/*left child node subscript.

*得到第i個節點的左孩子節點在陣列中的下標

*注意節點從1開始計算

*/ int left(int i) 

/*right child node subscript

*得到第i個節點的右孩子節點在陣列中的下標

*注意節點從1開始計算

*/ int right(int i)  

/*maximum heap sort

*最大堆的排序方法

*@parameter

*   p:要進行排序的陣列的其實座標

*   location:當前要進行最大堆運算的父節點是樹中的第幾個節點,從1開始算起

*   count:(樹)堆中的節點個數。

*/ void max_heap(int *p, int location, int count) 

} else  

} else 

}  }  

}  int main() 

printf("\n"); 

return 0; 

} /*

*main function:maximum heap sort

*author:reage

*blog:

*/#include

#include

/*swap *p1 and p2 value

*/void swap(int *p1, int * p2)

/*left child node subscript.

*得到第i個節點的左孩子節點在陣列中的下標

*注意節點從1開始計算

*/int left(int i)

/*right child node subscript

*得到第i個節點的右孩子節點在陣列中的下標

*注意節點從1開始計算

*/int right(int i)

/*maximum heap sort

*最大堆的排序方法

*@parameter

* p:要進行排序的陣列的其實座標

* location:當前要進行最大堆運算的父節點是樹中的第幾個節點,從1開始算起

* count:(樹)堆中的節點個數。

*/void max_heap(int *p, int location, int count)

} else

}  else

} } }

int main()

printf("\n");

return 0;

}

最大堆 排序

解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...

最大堆實現堆排序

堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...

最大堆排序 C

堆排序是一種複雜度為o nlog n 的一種高效的排序,這裡將展示最大堆的排序演算法。堆排序是將陣列抽象化成為乙個完全二叉樹。這裡對 a 10 抽象的二叉樹結構如下 1 下面三個節點是得到左子節點,右子節點,和父節點。intleft inti 返回左兒子 intright inti 返回右兒子 in...