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

堆排序

时间:2017-10-27 20:39:09      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:logs   sort   size   int   col   空间复杂度   str   交换   void   

核心代码

  1 #define LEFT  (2*nRootID+1)
  2 #define RIGHT (2*nRootID+2)
  3 
  4 void Adjust(int arr[], int len, int nRootID)
  5 {
  6     assert(arr!=NULL && len>0);
  7 
  8     while(1)
  9     {
 10         //两个孩子
 11         if(RIGHT < len)
 12         {
 13             //左比右大
 14             if(arr[LEFT] > arr[RIGHT])
 15             {
 16                 //左比父亲大
 17                 if(arr[LEFT] > arr[nRootID])
 18                 {
 19                     //交换
 20                     arr[LEFT] = arr[LEFT] ^ arr[nRootID];
 21                     arr[nRootID] = arr[LEFT] ^ arr[nRootID];
 22                     arr[LEFT] = arr[LEFT] ^ arr[nRootID];
 23 
 24                     //被交换节点作为新的调整节点
 25                     nRootID = LEFT;
 26                     continue;
 27                 }
 28                 else
 29                 {
 30                     break;
 31                 }
 32             }
 33             else
 34             {
 35                 //右比父亲大
 36                 if(arr[RIGHT] > arr[nRootID])
 37                 {
 38                     //交换
 39                     arr[RIGHT] = arr[RIGHT] ^ arr[nRootID];
 40                     arr[nRootID] = arr[RIGHT] ^ arr[nRootID];
 41                     arr[RIGHT] = arr[RIGHT] ^ arr[nRootID];
 42 
 43                     //被交换节点作为新的调整节点
 44                     nRootID = RIGHT;
 45                     continue;
 46                 }
 47                 else
 48                 {
 49                     break;
 50                 }
 51             }
 52         }
 53         //一个孩子
 54         else if(LEFT < len)
 55         {
 56             //左比父亲大
 57             if(arr[LEFT] > arr[nRootID])
 58             {
 59                 //交换
 60                 arr[LEFT] = arr[LEFT] ^ arr[nRootID];
 61                 arr[nRootID] = arr[LEFT] ^ arr[nRootID];
 62                 arr[LEFT] = arr[LEFT] ^ arr[nRootID];
 63 
 64                 //被交换节点作为新的调整节点
 65                 nRootID = LEFT;
 66                 continue;
 67             }
 68             else
 69             {
 70                 break;
 71             }
 72         }
 73         //没有孩子
 74         else
 75         {
 76             break;
 77         }
 78     }
 79 }
 80 
 81 void HeapSort(int arr[], int len)
 82 {
 83     int i;
 84 
 85     assert(arr!=NULL && len>0);
 86 
 87     //建堆
 88     //从最后一个父亲节点开始调整
 89     for(i=len/2-1; i>=0; --i)
 90     {
 91         //调整
 92         Adjust(arr, len, i);
 93     }
 94 
 95     //排序
 96     for(i=len-1; i>0; --i)
 97     {
 98         //堆顶和最后位置交换
 99         arr[i] = arr[i] ^ arr[0];
100         arr[0] = arr[i] ^ arr[0];
101         arr[i] = arr[i] ^ arr[0];
102 
103         //调整
104         Adjust(arr, i, 0);
105     }
106 }

算法分析:

  最好时间复杂度:O(nlog2(n))

  平均时间复杂度:O(nlog2(n))

  最坏时间复杂度:O(nlog2(n))

    空间复杂度:O(1)

      稳定性:不稳定

堆排序

标签:logs   sort   size   int   col   空间复杂度   str   交换   void   

原文地址:http://www.cnblogs.com/chen-cai/p/7744960.html

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