用c语言实现堆排序算法并编写相应的代码来计算每趟排序的时间和所需趟数
时间: 2024-11-05 15:28:30 浏览: 18
堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构。在C语言中,我们可以首先创建一个大顶堆(最大元素在根节点),然后反复将堆顶元素与最后一个元素交换并将剩余元素调整回堆,直到整个序列有序。以下是C语言实现堆排序的基本步骤以及计算时间的简单示例:
```c
#include <stdio.h>
#include <time.h>
// 定义大顶堆
void maxHeapify(int arr[], int n, int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(&arr[i], &arr[largest]);
maxHeapify(arr, n, largest);
}
}
// 建立最大堆
void buildMaxHeap(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--)
maxHeapify(arr, n, i);
}
// 主函数,堆排序
void heapSort(int arr[], int n) {
buildMaxHeap(arr, n);
for (int i = n - 1; i >= 0; i--) {
// 将堆顶元素与最后一个元素交换
swap(&arr[0], &arr[i]);
// 调整剩下的n-1个元素为新的最大堆
maxHeapify(arr, i, 0);
}
}
// 用于计时的辅助函数
double get_time() {
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
return difftime(end.tv_sec, start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;
}
int main() {
int arr[] = {9, 7, 5, 11, 12, 2, 14, 3};
int n = sizeof(arr) / sizeof(arr[0]);
double time_per_pass = 0;
int passes = 0;
clock_t start = clock();
heapSort(arr, n);
clock_t end = clock();
passes++;
time_per_pass += (double)(end - start) / CLOCKS_PER_SEC;
printf("Sorted array is: \n");
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
printf("\nTime taken per pass: %.6f seconds\n", time_per_pass / passes);
printf("Number of passes: %d\n", passes);
return 0;
}
```
这个程序首先建立了一个最大堆,然后通过不断交换堆顶元素和末尾元素,并调整剩余部分成堆,实现了排序。`get_time`函数用于测量每次排序的耗时,`main`函数中记录了总的排序时间和所需的趟数。
阅读全文