对快速排序、大根堆排序,两种排序方法进行比较,c语言实现大根堆排序算法。并对它们最坏、最好,平均情况进行比较分析
时间: 2024-03-06 13:46:36 浏览: 71
下面是C语言实现大根堆排序算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 堆排序中的堆调整函数
void heapAdjust(int arr[], int parent, int length)
{
int temp = arr[parent]; // 保存当前父节点
int child = 2 * parent + 1; // 找到左子节点
while (child < length)
{
// 如果右子节点比左子节点大,则定位到右子节点
if (child + 1 < length && arr[child] < arr[child + 1])
{
child++;
}
// 如果父节点比子节点大或相等,则结束循环
if (temp >= arr[child])
{
break;
}
// 将子节点赋值给父节点
arr[parent] = arr[child];
parent = child;
child = 2 * parent + 1;
}
// 将原来的父节点赋值给最后的位置
arr[parent] = temp;
}
// 堆排序函数
void heapSort(int arr[], int length)
{
// 构建大根堆
for (int i = length / 2 - 1; i >= 0; i--)
{
heapAdjust(arr, i, length);
}
// 交换堆顶元素和最后一个元素,然后重新调整堆
for (int i = length - 1; i > 0; i--)
{
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapAdjust(arr, 0, i);
}
}
int main()
{
int arr[] = { 3, 2, 4, 1, 5 };
int length = sizeof(arr) / sizeof(arr[0]);
heapSort(arr, length);
for (int i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
对于最坏、最好、平均情况的时间复杂度分析,与快速排序类似,大根堆排序的最坏情况时间复杂度为O(nlogn),最好情况时间复杂度仍为O(nlogn),平均情况时间复杂度为O(nlogn)。但是,大根堆排序没有快速排序的优化,因此在实际应用中可能会比快速排序效率略低。
阅读全文