HeapSort,use maximun heap...

  1. /*
  2. 建议大家到这看:
  3. http://topic.csdn.net/u/20081129/21/81fb7e89-0df5-4911-9884-d05680705a3c.html
  4. */
  5. #include<iostream> 
  6. #include<ctime> 
  7. using namespace std;
  8. const int DefaultSize = 100;
  9. class MaxHeap
  10. {
  11. public:
  12.     MaxHeap(int sz);
  13.     int Parent(int i) { return i/2;}
  14.     int Left(int i) { return 2*i;}
  15.     int Right(int i) {return 2*i+1;}
  16.     void MaxHeapify(int* arr,int i);
  17.     void BuildMaxHeap(int* arr,int arrSize);
  18.     void HeapSort(int* arr,int arrSize);
  19. private:
  20.     //int* maxHeap; 
  21.     int currentSize;  //maxHeapSize; 
  22.     void Swap(int &i,int &j) {int t=i; i=j; j=t;}
  23. };
  24. MaxHeap::MaxHeap(int arrSize)
  25. {
  26.     currentSize = arrSize;
  27. }
  28. void MaxHeap::MaxHeapify(int *arr,int i)
  29. {
  30.     int l = Left(i), r = Right(i),largest;   //left,right,largest 
  31.     if (l<=currentSize && arr[l]>arr[i]) largest = l;
  32.     else largest = i;
  33.     if (r<=currentSize && arr[r]>arr[largest]) largest = r;
  34.     if (largest != i)
  35.     {
  36.         Swap(arr[i],arr[largest]);
  37.         MaxHeapify(arr,largest);
  38.     }
  39. }
  40. void MaxHeap::BuildMaxHeap(int* arr,int arrSize)
  41. {
  42.     for (int i=arrSize/2;i>=0;i--)
  43.        MaxHeapify(arr,i);
  44. }
  45. void MaxHeap::HeapSort(int* arr,int arrSize)
  46. {
  47.     BuildMaxHeap(arr,arrSize);
  48.     //一开始我写成for (int i=arrSize/2;i>0;i--),害我对着书画图才发现这个错误,晕.. 
  49.     for (int i=arrSize;i>0;i--)  //最后只有一个元素,不用比较了 
  50.     {
  51.         Swap(arr[0],arr[i]);    //以arr[0]作为最大堆的根 
  52.         currentSize--;          //堆的大小减1 
  53.         MaxHeapify(arr,0); 
  54.     }
  55. }
  56. int main(void)
  57. {
  58.     srand(unsigned(time(NULL)));
  59.     int Size = DefaultSize;
  60.     int *array = new int[Size];
  61.     for(int i=0;i<Size;i++)
  62.         array[i] = rand()%1000;
  63.     cout<<"before sort"<<endl;
  64.     for(int i=0;i<Size;i++)
  65.     {
  66.         cout<<array[i]<<" ";
  67.         if((i+1)%10 == 0)cout<<endl;
  68.     }
  69.     MaxHeap maxHeap(Size-1);   //这里应为Size-1,因为传Size的话就数组越界了.. 
  70.     maxHeap.HeapSort(array,Size-1);
  71.     cout<<endl<<"After sort"<<endl;
  72.     for(int i=0;i<Size;i++)
  73.     {
  74.         cout<<array[i]<<" ";
  75.         if((i+1)%10 == 0)cout<<endl;
  76.     }
  77.     delete [] array;
  78.     return 0;
  79. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值