堆結構:是一種樹結構,準確說爲完全二叉樹。在這個樹中,每個節點對應原始數據的一個記錄,且滿足一下條件:1.如果按照從小到大的順序排序,要求非葉節點的數據要大於或等於其左右子節點的數據;2.如果按照從大到小的順序排序,要求非葉節點的數據要小於或等於其左右子節點的數據。
堆排序思路:基於選擇排序的思想,利用堆結構和二叉樹的一些性質來完成數據的排序。
流程:1).構造堆結構,把原始的無序數據按前面堆結構的定義進行調序;
2).堆排序輸出。
時間複雜度:最差O(nlog2(n)),平均O(nlog2(n)).
空間複雜度:O(1).
是一種 不穩定 的排序算法.
*/
void HeapSort(int *arr,int n)
{int i,j,h,k,temp;
for (i = (n / 2) - 1;i >= 0;i --)
{
while (2 * i + 1 < n)
{
j = 2 * i + 1;
if ((j + 1) < n)
{
if (arr[j] < arr[j + 1])
{
j ++;
}
}
if (arr[i] < arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i = j;
}
else
{
break;
}
}
}
printf("初始化爲大頂堆爲:");
for (h = 0;h < n;h ++){
printf("%d ",arr[h]);
}
printf("\n");
for (i = n - 1;i > 0;i --)
{
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
k = 0;
while (2 * k + 1 < i)
{
j = 2 * k + 1;
if ((j + 1) < i)
{
if (arr[j] < arr[j + 1])
{
j ++;
}
}
if (arr[k] < arr[j])
{
temp = arr[k];
arr[k] = arr[j];
arr[j] = temp;
k = j;
}
else
{
break;
}
}
printf("第 %d 次排序結果爲:",n - i);
for (h = 0;h < n;h ++)
{
printf("%d ",arr[h]);
}
printf("\n");
}
}