完全二叉樹:葉子節點在最後一層或者次一層,且節點從左往右連續
大根堆:任何根節點都比他的左右子節點都要大
i為節點在陣列中的索引,求節點的父節點:(i - 1) / 2, 求節點的左節點 i * 2 + 1,求節點的右節點 i * 2 + 2
//測試方法
@test
public
void
test()
heapify2
(array)
; system.out.
println
(arrays.
tostring
(array));
}//堆排
public
void
heapify2
(int
array)
//最後乙個節點的父節點
int parentnode =
(array.length -2)
/2;//進行堆排
for(
int i = parentnode; i >=
0; i--
)//交換最後乙個數和第乙個數,交換後最大的數到最後,下次堆排的時候,最後乙個數就不許算進去了
for(
int i = array.length -
1; i >
0; i--)}
/** * @description 遞迴寫法
*/public
void
sift2
(int
array,
int currentnode,
int length)
if(right <= length && array[right]
> array[max]
)//如果發生交換,我們就需要進行堆排了
if(max != currentnode)
}
/**
* @description 非遞迴寫法
*/public
void
sift1
(int
array,
int currentnode,
int length)
//由於左右已經進行比較了,所以我們只要於最大的比較
if(array[tmp]
< array[j]
)else
}}
堆排序(非遞迴)
以下 經測試,排序5000000 五千萬 int型資料沒有問題!第乙個引數是陣列首位址 第二個引數是陣列元素個數 void heapsort int const arr,const dword number 堆排序 indexup number 1 if 0 indexup 2 indexup fo...
堆排序(非遞迴)
將原問題劃分為乙個規模更小的子問題 分治法 結構清晰,量少,可讀性強。但同時遞迴也存在以下缺點 遞迴呼叫函式,時間開銷大。遞迴太深容易導致堆疊溢位。為了能解決上述兩個缺點,本文採用了非遞迴實現了非遞迴版本的堆排序演算法。但需要注意的是,非遞迴版的堆排序演算法,減少了函式的呼叫次數,避免了堆疊溢位的可...
C C 堆排序的非遞迴實現
1.父結點索引 i 1 2 這裡計算機中的除以2,省略掉小數 2.左孩子索引 2 i 1 3.右孩子索引 2 i 2 大根堆和小根堆 性質 每個結點的值都大於其左孩子和右孩子結點的值,稱之為大根堆 每個結點的值都小於其左孩子和右孩子結點的值,稱之為小根堆。堆排序原理參考文件 非遞迴堆排序流程圖 下面...