一、原理分析(以升序为例)
1.对待排序数组进行建堆(升序建大堆,降序建小堆)
2.交换堆顶元素和最后一个元素位置,让最大数排在最后一个,然后对堆顶元素进行向下调整(此时调整区间是前(n-1)个,不包括堆底的最大数),使既不破坏堆的结构,又让第二大的元素排在堆顶,接着重复进行这个过程,最后可使待排序数组有序。
画图分析:
代码展示:
void Swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void AdjustDown(int* arr, int sz, int root)
{
int parent = root;
int child = root * 2 + 1;
while (child < sz)
{
//找大孩子
if (child + 1 < sz && arr[child + 1] > arr[child])
{
child += 1;
}
if (arr[child] > arr[parent])
{
Swap(&arr[parent], &arr[child]);
}
parent = child;
child = parent * 2 + 1;
}
}
void CreatTree(int* arr, int sz)
{
for (int i = (sz-1-1)/2; i >= 0; i--)
{
AdjustDown(arr, sz, i);
}
}
void TreeSort(int* arr, int sz)
{
//建大堆
CreatTree(arr, sz);
//排序
for (int i = sz - 1; i > 0; i--)
{
Swap(&arr[i], &arr[0]);//交换两个数的函数
AdjustDown(arr, i-1, 0);//每次交换后,对堆顶元素进行向下调整建堆
}
}
int main()
{
int arr[] = { 2,6,3,1,4,5,7 };
int sz = sizeof(arr) / sizeof(arr[0]);
TreeSort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
二、特性分析
1.时间复杂度O(n*logn)
2.空间复杂度O(1)
3.稳定性:不稳定
三、小结
本人是C语言萌新一枚,希望能和大家多多交流,共同进步。如果对文章内容有什么指正、建议、疑问。欢迎在下方评论区留言一起探讨,谢谢大家!