根据输入的待排序整数序列建初堆(最大堆),先构造一棵与待排序序列对应的完全二叉树,然后从最后一个分支节点⌊n/2⌋开始,依次将序号⌊n/2⌋、⌊n/2⌋-1、…、1的结点作为根的子树通过自底向上的筛选调整为堆即可。构建好初始最大堆后,反复进行交换和堆调整,完成堆排序。 例如,输入待排序序列长度和待排序整数:5 2 3 5 4 1,可得到如下输出: 5 4 2 3 1(初始最大堆,按层序输出) 4 3 2 1 5(第1次堆调整后的结果) 3 1 2 4 5(第2次堆调整后的结果) 2 1 3 4 5(第3次堆调整后的结果) 1 2 3 4 5(第4次堆调整后的结果) 用c语言完成该代码
时间: 2024-03-06 14:50:47 浏览: 224
以下是用C语言实现待排序整数序列的堆排序代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 堆排序函数
void heapSort(int arr[], int n);
// 建堆函数
void buildMaxHeap(int arr[], int n);
// 调整堆函数
void adjustMaxHeap(int arr[], int i, int n);
// 主函数
int main()
{
int n, i;
printf("请输入待排序序列长度:");
scanf("%d", &n);
int *arr = (int*)malloc(sizeof(int) * n);
printf("请输入待排序整数序列:");
for(i = 0; i < n; i++)
scanf("%d", &arr[i]);
heapSort(arr, n);
printf("堆排序后的结果为:");
for(i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
free(arr);
return 0;
}
// 堆排序函数
void heapSort(int arr[], int n)
{
buildMaxHeap(arr, n); // 建立初始最大堆
int i;
for(i = n-1; i >= 1; i--)
{
int tmp = arr[i];
arr[i] = arr[0];
arr[0] = tmp;
adjustMaxHeap(arr, 0, i); // 调整堆
}
}
// 建堆函数
void buildMaxHeap(int arr[], int n)
{
int i;
for(i = n/2; i >= 0; i--) // 从最后一个分支节点开始调整堆
adjustMaxHeap(arr, i, n);
}
// 调整堆函数
void adjustMaxHeap(int arr[], int i, int n)
{
int j, tmp = arr[i];
for(j = 2*i; j < n; j *= 2)
{
if(j < n-1 && arr[j] < arr[j+1])
j++;
if(tmp >= arr[j])
break;
arr[i] = arr[j];
i = j;
}
arr[i] = tmp;
}
```
以上代码实现了堆排序算法,输入待排序整数序列长度和待排序整数序列,输出堆排序后的结果。
阅读全文
相关推荐

















