关于文件名排序算法

输入 : a1,a2,a10,a001

我们知道,如果按照字符串比较,结果应该是 a001,a1,a10,a2,但我们期望的结果应该是a001,a1,a2,a10.

自己写了一个算法,请参考,或者有更好的算法,请赐教

/*

Return Value Description 

< 0		arg1 less than arg2 

0		arg1 equivalent to arg2 

> 0		arg1 greater than arg2 

*/

int compare(const void* arg1,const void* arg2)

{

	if (NULL==arg1||NULL==arg2)//address of item

		return 0;

	LPSTR lpText1 = *( TCHAR** )arg1; //content of item

	LPSTR lpText2 = *( TCHAR** )arg2; //content of item

	if (NULL==lpText1||NULL==lpText2)

		return 0;



	int nText1Len = _tcslen(lpText1);

	int nText2Len = _tcslen(lpText2);

	int nText1IndexHandled = 0;

	int nText2IndexHandled = 0;

	int nRet = 0;



	for (;;)

	{

		if (nText1IndexHandled==nText1Len||nText2IndexHandled==nText2Len) //don't compare complete since all are same, "ab","abc"

		{

			TCHAR chOffset1 = nText1IndexHandled<nText1Len?lpText1[nText1IndexHandled]:0;

			TCHAR chOffset2 = nText2IndexHandled<nText2Len?lpText2[nText2IndexHandled]:0;

			nRet = (int)((WORD)chOffset1-(WORD)chOffset2);

			break;

		}



		TCHAR ch1 = *(lpText1+nText1IndexHandled);

		TCHAR ch2 = *(lpText2+nText2IndexHandled);

		if (isdigit(ch1)&&isdigit(ch2)) // if digit, change to number and compare

		{

			TCHAR* lpNum1 = new TCHAR[nText1Len];

			TCHAR* lpNum2 = new TCHAR[nText2Len];

			if (NULL==lpNum1||NULL==lpNum2)

				return 0;

			memset(lpNum1,0,nText1Len*sizeof(TCHAR));

			memset(lpNum2,0,nText2Len*sizeof(TCHAR));



			extractnumber(lpText1,nText1Len,nText1IndexHandled,lpNum1);

			extractnumber(lpText2,nText2Len,nText2IndexHandled,lpNum2);

			nRet = comparenumber(lpNum1,lpNum2);



			delete[] lpNum1;

			delete[] lpNum2;

		}

		else

		{			

			nRet = (int)((WORD)ch1-(WORD)ch2);

			nText1IndexHandled++;

			nText2IndexHandled++;

		}		

		

		if (nRet!=0)

			break;

	}



	return nRet;

}



TCHAR* extractnumber(TCHAR* lpBuf,int nLen,int& nIndexBegin,TCHAR* lpNumber)

{

	if (NULL==lpBuf||NULL==lpNumber)

		return lpNumber;



	for (int i=nIndexBegin,nIndex=0;i<nLen;++i,++nIndexBegin)

	{

		TCHAR ch = *(lpBuf+i);

		if (!isdigit(ch))

			break;

		lpNumber[nIndex++]=ch;

	}



	return lpNumber;

}



int comparenumber(TCHAR* lpNumber1,TCHAR* lpNumber2)

{

	if (NULL==lpNumber1||NULL==lpNumber2)

		return 0;

	int nNum1Len = _tcslen(lpNumber1);

	int nNum2Len = _tcslen(lpNumber2);

	int nMaxLen = max(nNum1Len,nNum2Len);

	TCHAR* lpFormatNum1 = new TCHAR[nMaxLen+1];

	TCHAR* lpFormatNum2 = new TCHAR[nMaxLen+1];

	if (NULL==lpFormatNum1||NULL==lpFormatNum2)

		return 0;



	memset(lpFormatNum1,_T('0'),nMaxLen*sizeof(TCHAR));

	memset(lpFormatNum2,_T('0'),nMaxLen*sizeof(TCHAR));

	lpFormatNum1[nMaxLen]=0;

	lpFormatNum2[nMaxLen]=0;

	

	int nPos = 0, nRet = 0;

	int nIndex = nMaxLen-1;

	for (nPos=nNum1Len-1;nPos>=0;--nPos)

		lpFormatNum1[nIndex--]=lpNumber1[nPos];



	nIndex = nMaxLen-1;

	for (nPos=nNum2Len-1;nPos>=0;--nPos)

		lpFormatNum2[nIndex--]=lpNumber2[nPos];



	for (nPos=0;nPos<nMaxLen;++nPos)

	{

		nRet = lpFormatNum1[nPos]-lpFormatNum2[nPos];

		if (nRet!=0)

			break;

	}



	delete[] lpFormatNum1;

	delete[] lpFormatNum2;



	return nRet;

}

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值