堆排序算法

/* date:2014.12.15
堆結構:是一種樹結構,準確說爲完全二叉樹。在這個樹中,每個節點對應原始數據的一個記錄,且滿足一下條件: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");
}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章