c 堆排序

Posted 3r3r3www

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c 堆排序相关的知识,希望对你有一定的参考价值。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. //堆调整,构建大顶堆,arr[]是待调整的数组,i是待调整的数组  
  4. //元素的位置,length是数组的长度  
  5. void HeapAdjust(int arr[], int i, int length)  
  6. {  
  7.     int Child;  
  8.     int temp;  
  9.     for(;2 * i + 1 < length; i = Child)  
  10.     {  
  11.         //子节点的位置 = 2 * (parent(父结点)) + 1  
  12.         Child = 2 * i + 1;  
  13.         //得到子结点中较大的结点  
  14.         if(Child < length - 1 && arr[Child + 1] > arr[Child])  
  15.                 ++Child;  
  16.         //如果较大的子结点大于父结点那么把较大的子结点往上移动  
  17.         //替换它的父结点  
  18.         if(arr[i] < arr[Child])  
  19.         {  
  20.             temp = arr[i];  
  21.             arr[i] = arr[Child];  
  22.             arr[Child] = temp;  
  23.         }  
  24.         else  
  25.                 break;  
  26.     }  
  27. }  
  28. //堆排序算法  
  29. void HeapSort(int arr[], int length)  
  30. {  
  31.     int i;  
  32.     //调整序列的前半部分元素,调整完之后第一个元素  
  33.     //是序列的最大元素,length/2-1是最后一个非叶子结点  
  34.     for(i = length/2 - 1; i >= 0; --i)  
  35.             HeapAdjust(arr, i, length);  
  36.     //从最后一个元素开始对序列进行调整,不断的缩小调整  
  37.     //的范围直到第一个元素  
  38.     //循环里是把第一个元素和当前的最后一个元素交换  
  39.     //保证当前的最后一个位置的元素是现在这个序列的最大的  
  40.     //不断的缩小调整heap的范围,每一次调整完毕保证第一个  
  41.     //元素是当前序列的最大的元素  
  42.     for(i = length - 1; i > 0; --i)  
  43.     {  
  44.         arr[i] = arr[0]^arr[i];  
  45.         arr[0] = arr[0]^arr[i];  
  46.         arr[i] = arr[0]^arr[i];  
  47.         HeapAdjust(arr, 0, i);                      //递归调整  
  48.     }  
  49. }  
  50.   
  51. int main()  
  52. {  
  53.     int i;  
  54.     int num[] = {98, 48, 777, 63, 57, 433, 23, 1112, 1};      
  55.     printf("==================堆排序==============\n");  
  56.     printf("实质上是一颗完全二叉树,利用树的根结点\n与子节点的性质进行排序\n");  
  57.     printf("======================================\n\n");  
  58.     printf("待排序的数据是:\n");  
  59.     for(i = 0; i < sizeof(num)/sizeof(int); i++)  
  60.     {  
  61.         printf("%d ", num[i]);  
  62.     }  
  63.     printf("\n");  
  64.     HeapSort(num, sizeof(num)/sizeof(int));  
  65.     printf("排序后的数据是:\n");  
  66.     for(i = 0; i < sizeof(num)/sizeof(int); i++)  
  67.     {  
  68.         printf("%d ", num[i]);  
  69.     }  
  70.     printf("\n");  
  71.     return 0;  
  72. }  


技术分享


以上是关于c 堆排序的主要内容,如果未能解决你的问题,请参考以下文章

基于C语言的堆排序

c语言 s数据结构 入元素序列,采用堆排序对序列进行排序,并将堆依据树状结构在屏幕上输出层次遍历的结果

面试必知必会|理解堆和堆排序

面试必知必会|理解堆和堆排序

植物大战 堆排序——纯C

C语言编程八大排序之堆排序