HeapSort,use maximun heap...

来源:互联网 发布:康乾盛世 知乎 编辑:程序博客网 时间:2024/06/06 10:04
  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. }