欢迎光临散文网 会员登陆 & 注册

王道计算机考研 数据结构

2023-08-20 14:51 作者:惊墨墨  | 我要投稿

//堆排序

#include <stdio.h>

void swap(int* a, int* b) {

  int temp = *a;

  *a = *b;

  *b = temp;

}

void HeadAdjust(int A[], int k, int len);



// 建立大根堆

void BuildMaxHeap(int A[], int len) {

  for (int i = len / 2; i > 0; i--) //从后往前调整所有非终端结点 

    HeadAdjust(A, i, len);

}

// 将以 k 为根的子树调整为大根堆

void HeadAdjust(int A[], int k, int len) {

  A[0] = A[k];            //A[0]暂存子树的根结点 

  for(int i = 2*k;i<=len;i*=2){ //沿key较大的子结点向下筛选 

    if(i < len && A[i] < A[i + 1])

      i++;          //取key较大的子结点的下标 

    if(A[0] >= A[i]) break;  // 筛选结束

    else{

      A[k] = A[i];      //将A[i]调整到双亲结点上 

      k = i;         //修改k值,以便继续向下筛选 

    }

  }     

  A[k] = A[0];          //被筛选结点的值放入最终位置 

}

// 建立大根堆


void HeapSort(int A[], int len) {

  BuildMaxHeap(A, len);    // 初始建堆

  for (int i = len; i > 1; i--) {  // n-1趟的交换和建堆过程

    swap(&A[i], &A[1]);      // 堆顶元素和堆底元素交换

    HeadAdjust(A, 1, i - 1); // 把剩余的待排序元素整理成堆

  }

}

int main() {

  int A[] = { 0, 53, 9, 87, 96, 32, 65, 78, 45 };

  int len = sizeof(A) / sizeof(A[0]) - 1;


  HeapSort(A, len);


  printf("Sorted array: ");

  for (int i = 1; i <= len; i++) {

    printf("%d ", A[i]);

  }

  printf("\n");


  return 0;

}


王道计算机考研 数据结构的评论 (共 条)

分享到微博请遵守国家法律