這種排序在 折半插入排序的基礎上更進一步, 比較次數更少了,先利用一個輔助空間,相同的就可以了。
首先看一下折半查找算法, 折半查找可以用遞歸來寫 也可以用 循環。
template<typename T>
int serach(T *p, int len, T key)
{
T low, high;
high = len;
low = 0;
while (low <= high)
{
int mid = (low + high) / 2;
if (*(p + mid) == key)
{
return mid;
}
if (*(p + mid) > key)
{
high = mid - 1;
}
if (*(p + mid) < key)
{
low = mid + 1;
}
}
return -1;
}
這是 用循環的方式寫的 , 如果查找得到了 需要找的元素 則返回該位置, 如果沒找到, 則返回-1.
再進行二路插入排序的過程中, 實際上就是兩個 有序的序列 進行插入, 最後合一起。
下面是給出的例子代碼:
template<typename T>
int serach(T *p, int len, T key)
{
T low, high;
high = len;
low = 0;
while (low <= high)
{
int mid = (low + high) / 2;
if (*(p + mid) == key)
{
return mid;
}
if (*(p + mid) > key)
{
high = mid - 1;
}
if (*(p + mid) < key)
{
low = mid + 1;
}
}
return low;
}
template<typename T>
int sort(T *src, T *dst, int len)
{
*dst = *src;
int final = 1, first = len;
for (int i = 1; i < len; i++)
{
if (*(src + i) >= *dst)
{
if (final == 1) //第一次直接賦值
{
*(dst + final) = *(src + i);
final++;
continue;
}
//////////////////////////////////////////////////////////////////////////
int pos = serach(dst, final, *(src + i));
if (pos == final) //比最後一個值 還要大
{
*(dst + final) = *(src + i);
final++;
if (final == first)
{
return final;
}
continue;
}
memcpy(dst + pos + 1, dst + pos, sizeof(T) * (final- pos));
*(dst + pos) = *(src + i);
final++;
//////////////////////////////////////////////////////////////////////////
}
else
{
if (first == len) //第一次插入的時候 後面沒有值
{
*(dst + len - 1) = *(src + i);
first --;
if (final == first)
{
return final;
}
continue;
}
//////////////////////////////////////////////////////////////////////////
int pos = serach(dst + first, len - first + 1, *(src + i));
if (pos == 0) //比第一個還要小
{
*(dst + first - 1) = *(src + i);
first--;
if (final == first)
{
return final;
}
continue;
}
else //集體後移 騰出空間來
{
memcpy(dst + first - 1, dst + first, sizeof(T) * (pos) );
*(dst + first + pos - 1) = *(src + i);
first--;
if (final == first)
{
return final;
}
}
//////////////////////////////////////////////////////////////////////////
}
}
return final;
}
int main(int argc, char* argv[])
{
int src[7] = { 1000, 12, 40, 704, 33, 999, 0 };
int dst[7] = {0};
int final = sort(src, dst, 7);
printf("%d\n", final);
for (int i = 0; i < 7; i++)
{
printf("%d ", dst[i]);
}
system("pause");
return 0;
}
如果大家認爲可以優化的地方,或者代碼有什麼錯誤 歡迎大家指正。 這是1000人C++ 羣: C語言/C++/STL/linux/MFC/WTL 77278127 歡迎大家進來討論