以下**經測試,排序5000000(五千萬)int型資料沒有問題!
第乙個引數是陣列首位址
第二個引數是陣列元素個數
void heapsort(int * const arr, const dword number)//堆排序
indexup = number-1;
if (0 != (indexup%2))
indexup--;
}for (; indexup>0; indexup-=2)
else
}else
else
}while ((2*indexdown) < number)
else
}else
else}}
}tmp = arr[0];
arr[0] = arr[number-1];
arr[number-1] = tmp;
for (num=number-1; num>1; num--)
else
}else
else}}
tmp = arr[0];
arr[0] = arr[num-1];
arr[num-1] = tmp;}}
測試**:
#include #include #include void heapsort(int * const arr, const dword number);//堆排序
void examinearr(const int * const arr, dword number);//檢查排序結果
int main(int argc, char *argv)
starttime = gettickcount();
for (i=0; iarr[tmpindex])
indexup--;
}for (; indexup>0; indexup-=2)
else
}else
else
}while ((2*indexdown) < number)
else
}else
else}}
}tmp = arr[0];
arr[0] = arr[number-1];
arr[number-1] = tmp;
for (num=number-1; num>1; num--)
else
}else
else}}
tmp = arr[0];
arr[0] = arr[num-1];
arr[num-1] = tmp;
}}void examinearr(const int * const arr, dword number)
for (; jarr[j])}}
堆排序(非遞迴)
將原問題劃分為乙個規模更小的子問題 分治法 結構清晰,量少,可讀性強。但同時遞迴也存在以下缺點 遞迴呼叫函式,時間開銷大。遞迴太深容易導致堆疊溢位。為了能解決上述兩個缺點,本文採用了非遞迴實現了非遞迴版本的堆排序演算法。但需要注意的是,非遞迴版的堆排序演算法,減少了函式的呼叫次數,避免了堆疊溢位的可...
堆排序遞迴和非遞迴
完全二叉樹 葉子節點在最後一層或者次一層,且節點從左往右連續 大根堆 任何根節點都比他的左右子節點都要大 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 大根堆和小根堆 性質 每個結點的值都大於其左孩子和右孩子結點的值,稱之為大根堆 每個結點的值都小於其左孩子和右孩子結點的值,稱之為小根堆。堆排序原理參考文件 非遞迴堆排序流程圖 下面...