- /*
- 建议大家到这看:
- http://topic.csdn.net/u/20081129/21/81fb7e89-0df5-4911-9884-d05680705a3c.html
- */
- #include<iostream>
- #include<ctime>
- using namespace std;
- const int DefaultSize = 100;
- class MaxHeap
- {
- public:
- MaxHeap(int sz);
- int Parent(int i) { return i/2;}
- int Left(int i) { return 2*i;}
- int Right(int i) {return 2*i+1;}
- void MaxHeapify(int* arr,int i);
- void BuildMaxHeap(int* arr,int arrSize);
- void HeapSort(int* arr,int arrSize);
- private:
- //int* maxHeap;
- int currentSize; //maxHeapSize;
- void Swap(int &i,int &j) {int t=i; i=j; j=t;}
- };
- MaxHeap::MaxHeap(int arrSize)
- {
- currentSize = arrSize;
- }
- void MaxHeap::MaxHeapify(int *arr,int i)
- {
- int l = Left(i), r = Right(i),largest; //left,right,largest
- if (l<=currentSize && arr[l]>arr[i]) largest = l;
- else largest = i;
- if (r<=currentSize && arr[r]>arr[largest]) largest = r;
- if (largest != i)
- {
- Swap(arr[i],arr[largest]);
- MaxHeapify(arr,largest);
- }
- }
- void MaxHeap::BuildMaxHeap(int* arr,int arrSize)
- {
- for (int i=arrSize/2;i>=0;i--)
- MaxHeapify(arr,i);
- }
- void MaxHeap::HeapSort(int* arr,int arrSize)
- {
- BuildMaxHeap(arr,arrSize);
- //一开始我写成for (int i=arrSize/2;i>0;i--),害我对着书画图才发现这个错误,晕..
- for (int i=arrSize;i>0;i--) //最后只有一个元素,不用比较了
- {
- Swap(arr[0],arr[i]); //以arr[0]作为最大堆的根
- currentSize--; //堆的大小减1
- MaxHeapify(arr,0);
- }
- }
- int main(void)
- {
- srand(unsigned(time(NULL)));
- int Size = DefaultSize;
- int *array = new int[Size];
- for(int i=0;i<Size;i++)
- array[i] = rand()%1000;
- cout<<"before sort"<<endl;
- for(int i=0;i<Size;i++)
- {
- cout<<array[i]<<" ";
- if((i+1)%10 == 0)cout<<endl;
- }
- MaxHeap maxHeap(Size-1); //这里应为Size-1,因为传Size的话就数组越界了..
- maxHeap.HeapSort(array,Size-1);
- cout<<endl<<"After sort"<<endl;
- for(int i=0;i<Size;i++)
- {
- cout<<array[i]<<" ";
- if((i+1)%10 == 0)cout<<endl;
- }
- delete [] array;
- return 0;
- }
HeapSort,use maximun heap...
最新推荐文章于 2019-06-20 13:57:16 发布