码迷,mamicode.com
首页 > 编程语言 > 详细

c 堆排序

时间:2017-11-02 23:20:01      阅读:430      评论:0      收藏:0      [点我收藏+]

标签:开始   data   class   return   src   repr   art   enter   http   

  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 堆排序

标签:开始   data   class   return   src   repr   art   enter   http   

原文地址:http://www.cnblogs.com/jrsflak/p/7774895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!