zoukankan      html  css  js  c++  java
  • 王道数据结构 (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);
      }

    先交换 再进行初始堆操作 

    越努力越幸运
  • 相关阅读:
    GoCN每日新闻(2019-11-03)
    GoCN每日新闻(2019-11-02)
    GoCN每日新闻(2019-11-01)
    GoCN每日新闻(2019-10-31)
    GoCN每日新闻(2019-10-30)
    GoCN每日新闻(2019-10-29)
    xms西软预定列表-房类市场
    GoCN每日新闻(2019-10-28)
    GoCN每日新闻(2019-10-27)
    GoCN每日新闻(2019-10-26)
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13533895.html
Copyright © 2011-2022 走看看