1.父結點索引:(i-1)/2(這裡計算機中的除以2,省略掉小數)
2.左孩子索引:2*i+1
3.右孩子索引:2*i+2
大根堆和小根堆堆排序原理參考文件性質:每個結點的值都大於其左孩子和右孩子結點的值,稱之為大根堆;每個結點的值都小於其左孩子和右孩子結點的值,稱之為小根堆。
非遞迴堆排序流程圖:
下面展示非遞迴堆排序的**片
// a為存放著需要進行堆排序資料的陣列
void
heapsort
(datetype a
,int size)
}temp =a[
0];a
[0]=
a[j];a
[j]= temp;
//將最大根堆的根節點與最後乙個數交換
//然後排序剩餘的堆
}}
題目:
生成500個在[200, 10000]之間的整數儲存陣列a中,以此陣列元素作為關鍵字,採用堆排序演算法按非遞減(遞增)方式進行排序rand函式參考文件
#include
#include
#include
//涵括了rand函式
#define maxsize 500
typedef int datetype;
void
main()
,b[1000];
//陣列初始化,全部賦值為-1
for(i =
0; i <
1000
; i++
)//我的題目要求是生成五百個互不相同的隨機數,所以直接將i的上限寫成500
//其他需求的可以用scanf語句鍵入所需的數量
for(i =
0; i <
500; i++)a
[i]=
b[temp]
; temp++;}
size=
500;
//陣列訪問下標的上限
heapsort(a
,size);}
void
heapsort
(datetype a
,int size)
}temp =a[
0];a
[0]=
a[j];a
[j]= temp;
//將最大根堆的根節點與最後乙個數交換
//然後排序剩餘的堆
}}
堆排序(非遞迴)
以下 經測試,排序5000000 五千萬 int型資料沒有問題!第乙個引數是陣列首位址 第二個引數是陣列元素個數 void heapsort int const arr,const dword number 堆排序 indexup number 1 if 0 indexup 2 indexup fo...
堆排序(非遞迴)
將原問題劃分為乙個規模更小的子問題 分治法 結構清晰,量少,可讀性強。但同時遞迴也存在以下缺點 遞迴呼叫函式,時間開銷大。遞迴太深容易導致堆疊溢位。為了能解決上述兩個缺點,本文採用了非遞迴實現了非遞迴版本的堆排序演算法。但需要注意的是,非遞迴版的堆排序演算法,減少了函式的呼叫次數,避免了堆疊溢位的可...
堆排序遞迴和非遞迴
完全二叉樹 葉子節點在最後一層或者次一層,且節點從左往右連續 大根堆 任何根節點都比他的左右子節點都要大 i為節點在陣列中的索引,求節點的父節點 i 1 2,求節點的左節點 i 2 1,求節點的右節點 i 2 2 測試方法 test public void test heapify2 array s...