將原問題劃分為乙個規模更小的子問題(分治法)。
**結構清晰,**量少,可讀性強。
但同時遞迴也存在以下缺點:
遞迴呼叫函式,時間開銷大。
遞迴太深容易導致堆疊溢位。
為了能解決上述兩個缺點,本文採用了非遞迴實現了非遞迴版本的堆排序演算法。但需要注意的是,非遞迴版的堆排序演算法,減少了函式的呼叫次數,避免了堆疊溢位的可能,但是其**相對較為複雜,且不容易理解。
#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 大根堆和小根堆 性質 每個結點的值都大於其左孩子和右孩子結點的值,稱之為大根堆 每個結點的值都小於其左孩子和右孩子結點的值,稱之為小根堆。堆排序原理參考文件 非遞迴堆排序流程圖 下面...