C C 堆排序的非遞迴實現

2021-10-07 11:18:39 字數 1349 閱讀 4719

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...