王道数据结构 (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("\n");
  HeapSort(arr, 6);
  Print(arr, 6);
  printf("\n");
  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("\n");
  HeapSort(arr, 6);
  Print(arr, 6);
  printf("\n");
  return 0;
}

运行:

 

 

 

 

堆排序:

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

先交换 再进行初始堆操作 

posted @ 2020-08-20 11:02  1点  阅读(535)  评论(0编辑  收藏  举报