• 王道数据结构 (21) 堆排序 代码


    代码:

    #include <stdio.h>
    typedef int ElementType;
    int arr1[11] = {0, 2, 87, 39, 49, 34, 62, 53, 6, 44, 98};
    #define LeftChild(i) (2 * (i) + 1)

    void Swap(int *a, int *b)
    {
      int temp = *a;
      *a = *b;
      *b = temp;
    }

    void PercDown(int A[], int i, int N)
    {
      int child;
      ElementType Tmp;

      for (Tmp = A[i]; 2 * i + 1 < N; i = child)
      {
        child = 2 * i + 1; //注意数组下标是从0开始的,所以左孩子的求法不是2*i
        if (child != N - 1 && A[child + 1] > A[child])
          ++child; //找到最大的儿子节点
        if (Tmp < A[child])
          A[i] = A[child];
        else
          break;
      }
      A[i] = Tmp;
    }

    void HeapSort(int A[], int N)
    {
      int i;
      for (i = N / 2; i >= 0; --i)
        PercDown(A, i, N); //构造堆
      for (i = N - 1; i > 0; --i)
      {
        Swap(&A[0], &A[i]); //将最大元素(根)与数组末尾元素交换,从而删除最大元素,重新构造堆
        PercDown(A, 0, i);
      }
    }

    void Print(int A[], int N)
    {
      int i;
      for (i = 0; i < N; i++)
      {
        printf(" %d ", A[i]);
      }
    }
    int main()
    {
      int arr[6] = {16, 7, 3, 20, 17, 8};
      Print(arr, 6);
      printf(" ");
      HeapSort(arr, 6);
      Print(arr, 6);
      printf(" ");
      return 0;
    }

    运行 :

     

    构建初始堆:

    #include <stdio.h>
    typedef int ElementType;
    #define LeftChild(i) (2 * (i) + 1)
    
    // void Swap(int *a, int *b)
    // {
    //   int temp = *a;
    //   *a = *b;
    //   *b = temp;
    // }
    
    void PercDown(int A[], int i, int N)
    {
      int child;
      ElementType Tmp;
    
      for (Tmp = A[i]; 2 * i + 1 < N; i = child)
      {
        child = 2 * i + 1; //注意数组下标是从0开始的,所以左孩子的求法不是2*i
        if (child != N - 1 && A[child + 1] > A[child])
          ++child; //找到最大的儿子节点
        if (Tmp < A[child])
          A[i] = A[child];
        else
          break;
      }
      A[i] = Tmp;
    }
    
    void HeapSort(int A[], int N)
    {
      int i;
      for (i = N / 2; i >= 0; --i)
        PercDown(A, i, N); //构造堆
      // for (i = N - 1; i > 0; --i)
      // {
      //   Swap(&A[0], &A[i]); //将最大元素(根)与数组末尾元素交换,从而删除最大元素,重新构造堆
      //   PercDown(A, 0, i);
      // }
    }
    
    void Print(int A[], int N)
    {
      int i;
      for (i = 0; i < N; i++)
      {
        printf(" %d ", A[i]);
      }
    }
    int main()
    {
      int arr[6] = {16, 7, 3, 20, 17, 8};
      Print(arr, 6);
      printf("
    ");
      HeapSort(arr, 6);
      Print(arr, 6);
      printf("
    ");
      return 0;
    }

    运行:

    堆排序:

     for (i = N - 1; i > 0; --i)
      {
        Swap(&A[0], &A[i]); //将最大元素(根)与数组末尾元素交换,从而删除最大元素,重新构造堆
        PercDown(A, 0, i);
      }

    先交换 再进行初始堆操作 

    越努力越幸运
  • 相关阅读:
    IDirect3DDevice9::Clear
    Width vs Pitch
    5- vue django restful framework 打造生鲜超市 -完成商品列表页(上)
    4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍
    3- vue django restful framework 打造生鲜超市
    2- vue django restful framework 打造生鲜超市 -环境搭建
    1- vue django restful framework 打造生鲜超市
    Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章
    windows10上安装mysql
    博客开通第一天
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13533895.html
Copyright © 2020-2023  润新知