#include <iostream>
class CSort
{
int * m_pGivenData;
const int m_iGivenDataNumber;
void _PercolateDown(int * v_pGivenData, int v_iFatherNode, const int c_iGivenDataNumber )
{
int v_iTemp;
int v_iChild ;
for (v_iTemp = v_pGivenData[v_iFatherNode]; v_iFatherNode*2+1<c_iGivenDataNumber; v_iFatherNode = v_iChild)
{
v_iChild = v_iFatherNode*2+1;
if ((v_iChild < c_iGivenDataNumber-1) && (v_pGivenData[v_iChild + 1] > v_pGivenData[v_iChild]))
{
v_iChild++;
}
if (v_iTemp < v_pGivenData[v_iChild])
{
v_pGivenData[v_iFatherNode] = v_pGivenData[v_iChild];
}
else
{
break;
}
}
v_pGivenData[v_iFatherNode] = v_iTemp;
}
void _Merge(int * v_pTempArray, int v_iLeftPosition, int v_iRightPosition, int v_iRightEndPosition)
{
int v_iLeftEndPosition = v_iRightPosition-1;
int v_iTempPosition = v_iLeftPosition;
int v_iVariationElementsNumber = v_iRightEndPosition - v_iLeftPosition + 1;
while (v_iLeftPosition <= v_iLeftEndPosition && v_iRightPosition <= v_iRightEndPosition)
{
if (m_pGivenData[v_iLeftPosition] < m_pGivenData[v_iRightPosition])
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iLeftPosition++];
}
else
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iRightPosition++];
}
}
while (v_iLeftPosition <= v_iLeftEndPosition)
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iLeftPosition++];
}
while (v_iRightPosition <= v_iRightEndPosition)
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iRightPosition++];
}
//v_pTempArray 's elements copy to m_pGivenData
for (int i=v_iVariationElementsNumber; i>0; i--, v_iRightEndPosition--)
{
m_pGivenData[v_iRightEndPosition] = v_pTempArray[v_iRightEndPosition];
}
}
void _GetMerge(int *v_pTempArray, int v_iLeftPosition, int v_iRightPosition)
{
int v_iCenterPosition;
if (v_iLeftPosition <v_iRightPosition)
{
v_iCenterPosition = (v_iLeftPosition + v_iRightPosition)/2;
_GetMerge(v_pTempArray, v_iLeftPosition, v_iCenterPosition);
_GetMerge(v_pTempArray, v_iCenterPosition + 1, v_iRightPosition);
_Merge(v_pTempArray, v_iLeftPosition, v_iCenterPosition + 1, v_iRightPosition);
}
}
void _GetQuickSort(int v_iLeft, int v_iRight)
{
if (v_iLeft < v_iRight)
{
int i = v_iLeft, j = v_iRight -1 ;
int v_iPivot = m_pGivenData [(v_iLeft + v_iRight)/2];
int v_iTemp = v_iPivot;
m_pGivenData [(v_iLeft + v_iRight)/2] = m_pGivenData[j+1];
m_pGivenData[j+1] = v_iTemp;
while (1)
{
while (m_pGivenData [i] < v_iPivot)
{
i++;
}
while (m_pGivenData [j] > v_iPivot)
{
j--;
}
if ( i < j)
{
//change m_pGivenData[i] and m_pGivenData[j] with each other
int v_iTemp = m_pGivenData[i];
m_pGivenData[i] = m_pGivenData[j];
m_pGivenData[j] = v_iTemp;
}
else
{
break;
}
}
v_iTemp = m_pGivenData[i];
m_pGivenData[i] = m_pGivenData[v_iRight];
m_pGivenData[v_iRight] = v_iTemp;
_GetQuickSort(v_iLeft, i -1);
_GetQuickSort(i +1, v_iRight);
}
}
public:
CSort(int * v_pInputData, int v_iInputDataNumber):m_pGivenData(v_pInputData), m_iGivenDataNumber(v_iInputDataNumber){}
void InsertSort()
{
for (int i = 1; i < m_iGivenDataNumber; i++)
{
int v_iTemp = m_pGivenData[i];
int j = i - 1;
//if the current data is little than is previous data ,than change their position
while (m_pGivenData[j] > v_iTemp)
{
m_pGivenData[j+1] = m_pGivenData[j];
j--;
}
m_pGivenData[j+1] = v_iTemp;
}
}
void ChooseSort()
{
for (int i=0; i<m_iGivenDataNumber-1; i++)
{
for (int j = i+1; j<m_iGivenDataNumber; j++)
{
if (m_pGivenData[i] > m_pGivenData[j])
{
int v_iTemp = m_pGivenData[i];
m_pGivenData[i] = m_pGivenData[j];
m_pGivenData[j] = v_iTemp;
}
}
}
}
void BubbleSort()
{
for (int i=0; i<m_iGivenDataNumber-1 ; i++)
{
for (int j=0; j<m_iGivenDataNumber -i-1; j++)
{
if (m_pGivenData[j] > m_pGivenData[j+1])
{
int v_iTemp = m_pGivenData[j];
m_pGivenData[j] = m_pGivenData[j+1];
m_pGivenData[j+1] = v_iTemp;
}
}
}
}
void ShellSort()
{
for (int v_iIncrement = m_iGivenDataNumber / 2; v_iIncrement>0; v_iIncrement /= 2)
{
for (int i = v_iIncrement; i<m_iGivenDataNumber; i++)
{
int v_iTemp = m_pGivenData[i];
int j = i-v_iIncrement;
for ( ; j>=0; j -= v_iIncrement)
{
if (v_iTemp < m_pGivenData[j])
{
m_pGivenData[j + v_iIncrement] = m_pGivenData[j];
}
else
{
break;
}
}
m_pGivenData[j + v_iIncrement] = v_iTemp;
}
}
}
void HeapSort()
{
for (int i= m_iGivenDataNumber/2; i>=0; i--)
{
_PercolateDown(m_pGivenData, i, m_iGivenDataNumber);
}
for (int i = m_iGivenDataNumber-1; i>0; i--)
{
int v_iTemp = m_pGivenData[0];
m_pGivenData[0] = m_pGivenData[i];
m_pGivenData[i] = v_iTemp;
_PercolateDown(m_pGivenData, 0, i);
}
}
void MergeSort()
{
int *v_pTemp = new int [m_iGivenDataNumber];
if (v_pTemp !=NULL)
{
_GetMerge(v_pTemp, 0, m_iGivenDataNumber-1);
}
else
{
std::cout<<"no space for temp array!";
}
}
void QuickSort()
{
_GetQuickSort(0, m_iGivenDataNumber -1);
}
};
void main()
{
int v_gGivenData[] = {8, 1, 4, 9, 6, 3, 5, 2, 7, 0};
CSort v_iSort(v_gGivenData, 10);
v_iSort.QuickSort();
}
class CSort
{
int * m_pGivenData;
const int m_iGivenDataNumber;
void _PercolateDown(int * v_pGivenData, int v_iFatherNode, const int c_iGivenDataNumber )
{
int v_iTemp;
int v_iChild ;
for (v_iTemp = v_pGivenData[v_iFatherNode]; v_iFatherNode*2+1<c_iGivenDataNumber; v_iFatherNode = v_iChild)
{
v_iChild = v_iFatherNode*2+1;
if ((v_iChild < c_iGivenDataNumber-1) && (v_pGivenData[v_iChild + 1] > v_pGivenData[v_iChild]))
{
v_iChild++;
}
if (v_iTemp < v_pGivenData[v_iChild])
{
v_pGivenData[v_iFatherNode] = v_pGivenData[v_iChild];
}
else
{
break;
}
}
v_pGivenData[v_iFatherNode] = v_iTemp;
}
void _Merge(int * v_pTempArray, int v_iLeftPosition, int v_iRightPosition, int v_iRightEndPosition)
{
int v_iLeftEndPosition = v_iRightPosition-1;
int v_iTempPosition = v_iLeftPosition;
int v_iVariationElementsNumber = v_iRightEndPosition - v_iLeftPosition + 1;
while (v_iLeftPosition <= v_iLeftEndPosition && v_iRightPosition <= v_iRightEndPosition)
{
if (m_pGivenData[v_iLeftPosition] < m_pGivenData[v_iRightPosition])
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iLeftPosition++];
}
else
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iRightPosition++];
}
}
while (v_iLeftPosition <= v_iLeftEndPosition)
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iLeftPosition++];
}
while (v_iRightPosition <= v_iRightEndPosition)
{
v_pTempArray[v_iTempPosition++] = m_pGivenData[v_iRightPosition++];
}
//v_pTempArray 's elements copy to m_pGivenData
for (int i=v_iVariationElementsNumber; i>0; i--, v_iRightEndPosition--)
{
m_pGivenData[v_iRightEndPosition] = v_pTempArray[v_iRightEndPosition];
}
}
void _GetMerge(int *v_pTempArray, int v_iLeftPosition, int v_iRightPosition)
{
int v_iCenterPosition;
if (v_iLeftPosition <v_iRightPosition)
{
v_iCenterPosition = (v_iLeftPosition + v_iRightPosition)/2;
_GetMerge(v_pTempArray, v_iLeftPosition, v_iCenterPosition);
_GetMerge(v_pTempArray, v_iCenterPosition + 1, v_iRightPosition);
_Merge(v_pTempArray, v_iLeftPosition, v_iCenterPosition + 1, v_iRightPosition);
}
}
void _GetQuickSort(int v_iLeft, int v_iRight)
{
if (v_iLeft < v_iRight)
{
int i = v_iLeft, j = v_iRight -1 ;
int v_iPivot = m_pGivenData [(v_iLeft + v_iRight)/2];
int v_iTemp = v_iPivot;
m_pGivenData [(v_iLeft + v_iRight)/2] = m_pGivenData[j+1];
m_pGivenData[j+1] = v_iTemp;
while (1)
{
while (m_pGivenData [i] < v_iPivot)
{
i++;
}
while (m_pGivenData [j] > v_iPivot)
{
j--;
}
if ( i < j)
{
//change m_pGivenData[i] and m_pGivenData[j] with each other
int v_iTemp = m_pGivenData[i];
m_pGivenData[i] = m_pGivenData[j];
m_pGivenData[j] = v_iTemp;
}
else
{
break;
}
}
v_iTemp = m_pGivenData[i];
m_pGivenData[i] = m_pGivenData[v_iRight];
m_pGivenData[v_iRight] = v_iTemp;
_GetQuickSort(v_iLeft, i -1);
_GetQuickSort(i +1, v_iRight);
}
}
public:
CSort(int * v_pInputData, int v_iInputDataNumber):m_pGivenData(v_pInputData), m_iGivenDataNumber(v_iInputDataNumber){}
void InsertSort()
{
for (int i = 1; i < m_iGivenDataNumber; i++)
{
int v_iTemp = m_pGivenData[i];
int j = i - 1;
//if the current data is little than is previous data ,than change their position
while (m_pGivenData[j] > v_iTemp)
{
m_pGivenData[j+1] = m_pGivenData[j];
j--;
}
m_pGivenData[j+1] = v_iTemp;
}
}
void ChooseSort()
{
for (int i=0; i<m_iGivenDataNumber-1; i++)
{
for (int j = i+1; j<m_iGivenDataNumber; j++)
{
if (m_pGivenData[i] > m_pGivenData[j])
{
int v_iTemp = m_pGivenData[i];
m_pGivenData[i] = m_pGivenData[j];
m_pGivenData[j] = v_iTemp;
}
}
}
}
void BubbleSort()
{
for (int i=0; i<m_iGivenDataNumber-1 ; i++)
{
for (int j=0; j<m_iGivenDataNumber -i-1; j++)
{
if (m_pGivenData[j] > m_pGivenData[j+1])
{
int v_iTemp = m_pGivenData[j];
m_pGivenData[j] = m_pGivenData[j+1];
m_pGivenData[j+1] = v_iTemp;
}
}
}
}
void ShellSort()
{
for (int v_iIncrement = m_iGivenDataNumber / 2; v_iIncrement>0; v_iIncrement /= 2)
{
for (int i = v_iIncrement; i<m_iGivenDataNumber; i++)
{
int v_iTemp = m_pGivenData[i];
int j = i-v_iIncrement;
for ( ; j>=0; j -= v_iIncrement)
{
if (v_iTemp < m_pGivenData[j])
{
m_pGivenData[j + v_iIncrement] = m_pGivenData[j];
}
else
{
break;
}
}
m_pGivenData[j + v_iIncrement] = v_iTemp;
}
}
}
void HeapSort()
{
for (int i= m_iGivenDataNumber/2; i>=0; i--)
{
_PercolateDown(m_pGivenData, i, m_iGivenDataNumber);
}
for (int i = m_iGivenDataNumber-1; i>0; i--)
{
int v_iTemp = m_pGivenData[0];
m_pGivenData[0] = m_pGivenData[i];
m_pGivenData[i] = v_iTemp;
_PercolateDown(m_pGivenData, 0, i);
}
}
void MergeSort()
{
int *v_pTemp = new int [m_iGivenDataNumber];
if (v_pTemp !=NULL)
{
_GetMerge(v_pTemp, 0, m_iGivenDataNumber-1);
}
else
{
std::cout<<"no space for temp array!";
}
}
void QuickSort()
{
_GetQuickSort(0, m_iGivenDataNumber -1);
}
};
void main()
{
int v_gGivenData[] = {8, 1, 4, 9, 6, 3, 5, 2, 7, 0};
CSort v_iSort(v_gGivenData, 10);
v_iSort.QuickSort();
}