您的位置:首页 > 编程语言 > C语言/C++

C++模板实现梳排序

2017-04-20 20:52 786 查看
梳排序是一种改进的冒泡排序算法,通过比较元素彼此之间的步长位置这种方式先对数据进行预处理,在每次移动中,步长会越来越小,直至他等于1.这一理念就是在正式排序前先将一些大元素移动至数组的底部.之后正式排序采用冒泡排序算法来进行.

大量试验证明,步长缩短因子为1.3时,能达到较高的效率.梳排序的良好性能可与快速排序相媲美.

算法实现如下:

//Combsort
//1. Stable
//2. Time complex O(n2)
//3. Space complecity, O(n2)
//4. Terminate condition, for first stage, step become 1, for second stage, during one time compare, no change happens

template<typename T>
void Sort<T>::combSort(T* const sortArray, const unsigned int size)
{
//First stage
unsigned int step = size / 1.3;
while (step > 1)
{
for (unsigned int i = size - 1; i >= step; i--)
{
if (sortArray[i] < sortArray[i - step])
{
T temp = sortArray[i];
sortArray[i] = sortArray[i - step];
sortArray[i - step] = temp;
moveTimes++;
}
loopTimes++;
}
step = step / 1.3;
}

//Second stage
bool hasSwap = false;
for (unsigned int i = 0; i < size; i++)
{
hasSwap = false;
for (unsigned int j = size - 1; j > i; j--)
{
loopTimes++;
if (sortArray[j] < sortArray[j - 1])
{
T temp = sortArray[j];
sortArray[j] = sortArray[j - 1];
sortArray[j - 1] = temp;
hasSwap = true;
moveTimes++;
}
}
if (!hasSwap)
{
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: