各種排序算法的實現-3(2路插入排序)

     這種排序在 折半插入排序的基礎上更進一步, 比較次數更少了,先利用一個輔助空間,相同的就可以了。

首先看一下折半查找算法, 折半查找可以用遞歸來寫 也可以用 循環。

     

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  歡迎大家進來討論

      


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章