#include #include #include #include #include #define MAX 10000 class Sort { int A[MAX]; public: void Init(); void Menu(); void Delay(int); void Loading(); void InsertionSort(); void ShellSort(); void SortInterval(int,int); int Min(int); void SelectionSort(); void BubbleSort(); void Merge(int,int,int); void MergeSort(int,int); void Swap(int,int); int Partition(int,int); void QuickSort(int,int); void HeapSort(int); void ReheapUp(int); void ReheapDown(int,int); double ET(clock_t,clock_t); }; void Sort::Init() { int j=MAX-1; for (int i=0;i0)&&(currentstart) && (current1); } int Sort::Min(int pos) { int i,m,index=pos; m=A[pos]; for (i=pos+1;iA[j+1]) { temp=A[j]; A[j]=A[j+1]; A[j+1]=temp; sorted=0; } } i++; } } void Sort::Merge(int lpos, int rpos, int rend) { int i, lend, numelements, tmppos,TmpArray[MAX]; lend=rpos - 1; tmppos=lpos; numelements=rend-lpos+1; while ((lpos<=lend)&&(rpos<=rend)) if ( A[lpos] <= A[rpos]) TmpArray[tmppos++] = A[lpos++]; else TmpArray[tmppos++] = A[rpos++]; while (lpos <= lend) TmpArray[tmppos++] = A[lpos++]; while (rpos <= rend) TmpArray[tmppos++] = A[rpos++]; for (i = 0; i < numelements; i++, rend--) A[rend] = TmpArray[rend]; } void Sort::MergeSort(int left, int right) { int center; if (left < right) { center=(left+right)/2; MergeSort(left,center); MergeSort(center+1,right); Merge(left,center+1,right); } } void Sort::Swap(int x, int y) { int temp; temp=A[x]; A[x]=A[y]; A[y]=temp; } int Sort::Partition (int left, int right) { int pivot; int i,pivotpos; Swap(left,(left+right)/2); pivot=A[left]; pivotpos=left; for(i=left+1;i<=right;i++) if (A[i]0) { holdData=A[0]; A[0]=A[sorted]; A[sorted]=holdData; sorted--; ReheapDown(0,sorted); } } void Sort::ReheapUp(int newNode) { int parent; int hold; if(newNode) { parent=(newNode-1)/2; if(A[newNode]>A[parent]) { hold=A[parent]; A[parent]=A[newNode]; A[newNode]=hold; ReheapUp(parent); } } } void Sort::ReheapDown(int root,int last) { int hold; int leftkey; int rightkey; int largeChildKey; int largeChildIndex; if((root*2+1)<=last) { leftkey=A[root*2+1]; if((root*2+2)<=last) rightkey=A[root*2+2]; else rightkey=-1; if(leftkey>rightkey) { largeChildKey=leftkey; largeChildIndex=root*2+1; } else { largeChildKey=rightkey; largeChildIndex=root*2+2; } if(A[root]