堆排序(非遞迴)

2021-06-02 23:52:13 字數 1432 閱讀 8156

以下**經測試,排序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 大根堆和小根堆 性質 每個結點的值都大於其左孩子和右孩子結點的值,稱之為大根堆 每個結點的值都小於其左孩子和右孩子結點的值,稱之為小根堆。堆排序原理參考文件 非遞迴堆排序流程圖 下面...