堆排序(非遞迴)

2021-07-10 14:02:06 字數 2290 閱讀 1674

將原問題劃分為乙個規模更小的子問題(分治法)。

**結構清晰,**量少,可讀性強。

但同時遞迴也存在以下缺點:

遞迴呼叫函式,時間開銷大。

遞迴太深容易導致堆疊溢位。

為了能解決上述兩個缺點,本文採用了非遞迴實現了非遞迴版本的堆排序演算法。但需要注意的是,非遞迴版的堆排序演算法,減少了函式的呼叫次數,避免了堆疊溢位的可能,但是其**相對較為複雜,且不容易理解。

#include #define left(i)     (((i) << 1) + 1)

#define right(i) (((i) << 1) + 2)

#define parent(i) (((i) - 1) >> 1)

void heap_sort(int *a, int

len)

if (r < len && a[r] > a[largest])

if (largest != i) else

} len--;

while (len > 0)

if (r < len && a[r] > a[largest])

if (largest != i) else }}}

void display(int *a, int

len)

printf("\n");

}int main()

; int

len = sizeof(a) / sizeof(a[0]);

display(a, len);

heap_sort(a, len);

display(a, len);

return 0;

}

為了滿足通用性,本文同樣實現了類似於庫函式qsort排序演算法的通用版。

#include 

#define left(i) (((i) << 1) + 1)

#define right(i) (((i) << 1) + 2)

#define parent(i) (((i) - 1) >> 1)

#define swap(a, b, size) \

do while (--__size > 0); \

} while(0)

void display(int *a, int len)

printf("\n");

}/* @brief the hsort() function sorts an array with nmemb

* elements of size size.

* @param base [in] the start of the array.

* @param nmemb [in] the number of elements in array.

* @param size [in] the size of the element.

* @param compare [in] the comparison function.

*/void hsort(void *base, size_t nmemb, size_t size,

int (*compare)(const

void *, const

void *))

if (r < nmemb && compare(base + r * size, base + largest * size) > 0)

if (largest == i) else

} while (--nmemb > 0)

if (r < nmemb && compare(base + r * size, base + largest * size) > 0)

if (largest == i)

swap(base + i * size, base + largest * size, size);

i = largest;}}}

int compare(const

void *a, const

void *b)

int main()

; int len = sizeof(a) / sizeof(a[0]);

display(a, len);

hsort(a, len, sizeof(int), compare);

display(a, len);

return

0;}

堆排序(非遞迴)

以下 經測試,排序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...

C C 堆排序的非遞迴實現

1.父結點索引 i 1 2 這裡計算機中的除以2,省略掉小數 2.左孩子索引 2 i 1 3.右孩子索引 2 i 2 大根堆和小根堆 性質 每個結點的值都大於其左孩子和右孩子結點的值,稱之為大根堆 每個結點的值都小於其左孩子和右孩子結點的值,稱之為小根堆。堆排序原理參考文件 非遞迴堆排序流程圖 下面...