您的位置:首页 > 其它

堆排序算法

2014-12-15 19:02 106 查看
/* 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");

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: