排序算法大集合,插入、选择、冒泡、希尔、堆、归并、快速排序,总有一款适合你

#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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值