基本概念
选择排序的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置,直到未可以排序的元素个数为0。
其时间复杂度是:O(n2)。
选择排序法不是一种稳定算法
图示
常规代码实现
template<class T>
void SelectSort(T *pData, size_t size, bool IsUp = true)
{
T swap;
if (IsUp)
{
for (size_t i = 0; i < size - 1; ++i)
{
for (size_t j = i + 1; j < size; ++j)
{
if (pData[i] > pData[j])
{
swap = pData[i];
pData[i] = pData[j];
pData[j] = swap;
}
}
}
}
else
{
for (size_t i = 0; i < size - 1; ++i)
{
for (size_t j = i + 1; j < size; ++j)
{
if (pData[i] < pData[j])
{
swap = pData[i];
pData[i] = pData[j];
pData[j] = swap;
}
}
}
}
}
代码优化实现
我们可以通过减少数据的交换次数来提高代码执行的时间效率
template<class T>
void SelectSort2(T *pData, size_t size, bool IsUp = true)
{
T swap;
if (IsUp)
{
int limitindex = 0;
for (size_t i = 0; i < size - 1; ++i)
{
limitindex = i;
for (size_t j = i + 1; j < size; ++j)
{
if (pData[limitindex] > pData[j])
{
limitindex = j;
}
}
swap = pData[limitindex];
pData[limitindex] = pData[i];
pData[i] = swap;
}
}
else
{
int limitindex = 0;
for (size_t i = 0; i < size - 1; ++i)
{
limitindex = i;
for (size_t j = i + 1; j < size; ++j)
{
if (pData[limitindex] < pData[j])
{
limitindex = j;
}
}
swap = pData[limitindex];
pData[limitindex] = pData[i];
pData[i] = swap;
}
}
}