堆排序遞迴和非遞迴

2021-10-11 18:34:50 字數 1236 閱讀 1098

完全二叉樹:葉子節點在最後一層或者次一層,且節點從左往右連續

大根堆:任何根節點都比他的左右子節點都要大

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 大根堆和小根堆 性質 每個結點的值都大於其左孩子和右孩子結點的值,稱之為大根堆 每個結點的值都小於其左孩子和右孩子結點的值,稱之為小根堆。堆排序原理參考文件 非遞迴堆排序流程圖 下面...