当前位置:   article > 正文

C语言编写堆排序_堆排序代码c语言

堆排序代码c语言

堆排序是一种常见的排序算法,它可以通过使用堆这种数据结构来实现较快的排序。

堆是一种完全二叉树,它有两个特性:

  1. 父节点的值大于等于(或小于等于)它的子节点的值,这种特性被称为堆属性;
  2. 在堆中,除了根节点之外,所有节点的父节点和子节点之间不存在任何特别的关系。

堆排序的基本思想是:将待排序的数组构建成一个大顶堆(或小顶堆),然后将堆顶元素取出来放到数组的末尾,然后再对剩余的元素进行堆重构,重复进行此操作直到排序完成。

具体步骤如下:

  1. 构建大顶堆:将待排序的数组视为一棵完全二叉树,并从最后一个非叶子节点开始,逐个进行堆调整,以满足堆属性;
  2. 将堆顶元素取出,将其与数组末尾元素交换位置,并将堆的长度减1;
  3. 对除堆顶元素外的元素进行堆重构,重复步骤2和步骤3,直到堆的长度为1。

以下是堆排序的C语言完整代码:

  1. #include <stdio.h>
  2. /* 堆排序函数 */
  3. void heap_sort(int arr[], int n) {
  4. int i, temp;
  5. /* 构建最大堆 */
  6. for (i = n/2-1; i >= 0; i--) {
  7. max_heapify(arr, i, n);
  8. }
  9. /* 依次将每个最大元素放到数组末尾 */
  10. for (i = n-1; i >= 1; i--) {
  11. /* 将堆顶元素与当前堆的末尾元素交换位置 */
  12. temp = arr[0];
  13. arr[0] = arr[i];
  14. arr[i] = temp;
  15. /* 对剩余元素重新构建最大堆 */
  16. max_heapify(arr, 0, i);
  17. }
  18. }
  19. /* 对以i为根节点的子树进行最大堆化 */
  20. void max_heapify(int arr[], int i, int n) {
  21. int j, temp;
  22. temp = arr[i];
  23. j = 2 * i + 1;
  24. while (j < n) {
  25. /* 找到左右子节点中较大的那个 */
  26. if (j+1 < n && arr[j+1] > arr[j]) {
  27. j++;
  28. }
  29. /* 如果父节点比左右子节点中最大的还要大,则不需要继续调整 */
  30. if (temp >= arr[j]) {
  31. break;
  32. }
  33. /* 将父节点和左右子节点中最大的那个交换位置 */
  34. arr[i] = arr[j];
  35. i = j;
  36. j = 2 * i + 1;
  37. }
  38. /* 将原来的根节点放到正确的位置 */
  39. arr[i] = temp;
  40. }
  41. /* 主函数用于测试 */
  42. int main() {
  43. int arr[] = {5, 2, 8, 3, 1, 6, 9, 7, 4};
  44. int n = sizeof(arr) / sizeof(int);
  45. printf("Before sorting: ");
  46. print_arr(arr, n);
  47. heap_sort(arr, n);
  48. printf("After sorting: ");
  49. print_arr(arr, n);
  50. return 0;
  51. }
  52. /* 打印数组元素的函数 */
  53. void print_arr(int arr[], int n) {
  54. int i;
  55. for (i = 0; i < n; i++) {
  56. printf("%d ", arr[i]);
  57. }
  58. printf("\n");
  59. }

在这个代码中,主要的排序算法函数是堆排序函数heap_sort。该函数首先通过构建最大堆来将数组排序。然后,依次将每个最大元素放到数组末尾并对剩余元素重新构建最大堆。在构建最大堆的过程中,使用了最大堆化函数max_heapify来对每个子树进行最大堆化。最后,通过主函数调用堆排序函数heap_sort来测试排序算法的效果。

堆排序的时间复杂度为O(nlogn),其中n为待排序数组的长度。由于堆排序每次取出堆顶元素后都要进行堆重构,因此它不适用于小数据量的排序。但是,堆排序的空间复杂度为O(1),因此它在空间有限的情况下非常适用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/615372
推荐阅读
相关标签
  

闽ICP备14008679号