非递归归并排序(二路合并排序),非递归合并排序

 google了一下没找到像样的(实现太复杂,太低效),自己写一个发出来。以后还是要多贴些东西吧,不然博客很空! 下面的如果有可以改进的地方,表忘了告诉我。

自底向上的归并排序,举个例子吧还是:
现在要把下面的数组按递增顺序排列
9 8 7 6 5 4 3 2 1   

step1:(len=1) 8 9    6 7    4 5    2 3    1
step2:(len=2) 6 7 8 9    2 3 4 5    1
step3:(len=4) 2 3 4 5 6 7 8 9    1
step4:(len=8) 1 2 3 4 5 6 7 8 9

每次归并分组都有空格隔开了的,其中len的意思是:把数组中长度为len的相邻的两段进行合并,当len大于数组长度是结束。

so easy! 应该容易理解吧. 具体实现见下面代码。 

 

 

template <class T, class C>
void msort( T* table, const int& size, C cmp )
{
	int flag = 0;
	T* tmp = new T[size];
	T* src;
	T* dst;
	int b1, b2, e1, e2, len, index, di;

	for( len = 1; len <= size; len *= 2 ) //! O(logn)
	{
		if( flag % 2 == 0 ) src = table, dst = tmp;
		else src = tmp, dst = table;

		for( index = 0; index < size; index += ( len<<1 ) ) //! O(n)
		{
			if( index + len > size )
			{
				for( di = index; di < size; di++ ) dst[di] = src[di];
				break;
			}
			b1 = index, b2 = index + len, e1 = b1 + len, e2 = b2 + len, di = index;
			if( e2 > size ) e2 = size;

			while( b1 < e1 && b2 < e2 )
				dst[di++] = cmp( src[b1] ,src[b2] ) ? src[b1++] : src[b2++];
			while( b1 < e1 )
				dst[di++] = src[b1++];
			while( b2 < e2 )
				dst[di++] = src[b2++];
		}
		flag++;
	}
	if( flag % 2 == 1 )
		memcpy( table, dst, sizeof( int ) * size );
	delete [] tmp;
}


test code:

bool cmp( const int& a, const int& b ) { return a < b; }
int main()
{
	int hsize = 20;
	int testa[20] = \
            { 17 , 92, 3, 88, 5, 6, 7, 8, 9, 40, 11, 12, 13, 14, 25, 16, 87, 18, 19, 20 };
	msort( testa, hsize, cmp );
	for( int i = 0; i < hsize; i++ )
		std::cout<<testa[i] << " ";
	std::cout<< "\n";
	return 0;
}


 

要正式用的话,还应该自己实现内存分配器,不想太复杂,调用又很频繁地话,直接传缓存进去吧 微笑

你可能感兴趣的:(c,Google,table,delete,Class,DST)