读书人

排序后为何会出现重复呢

发布时间: 2013-01-19 11:41:36 作者: rapoo

排序后为什么会出现重复呢?
本帖最后由 tianliang0123 于 2013-01-11 19:44:42 编辑 我现在想把给定的一个文件根据第一个数字进行排序,文件的格式如下:
3-4 2-1 1-1 0-0
5-4 4-3 3-2 2-1 6-6 1-1 0-0 7-5
8-7 12-12 11-11 10-10 6-6 13-13 5-5 3-3 2-2 9-9 1-1 0-0 4-4 9-8
4-0 0-1 4-4 3-3 2-2 1-1
10-5 12-7 9-5 11-6 2-2 1-1 0-0 5-3 5-4 3-4 4-3 6-3 3-3 6-4 7-4 7-3 4-4 8-4 8-3
8-7 5-2 5-3 1-0 3-1 9-8 7-6 6-5 6-4 10-9 7-4 7-5 6-6 0-0
8-7 5-4 12-10 4-3 10-9 3-2 2-1 7-5 1-0 9-8 0-0 8-6
5-5 4-4 2-2 1-1 0-0 3-3
6-7 3-5 8-8 5-7 1-0 0-3 7-9 4-6 2-4 0-2 0-1
8-7 7-6 6-5 5-4 4-3 2-3 3-2 13-12 3-3 4-2 11-11 12-10 10-9 2-2 0-0 1-1 9-8
总体思路是,获取“-”左边的数字,然后根据冒泡法进行排序(BubbleSort()),然后去除重复的部分(deleteElement(int Array[], int nLen)),最后根据排序后的数字回到源文件去找寻相对应的字符串。不过最后得出的结果却成了:
0-0 1-1 2-1 3-4
0-0 1-1 2-1 3-2 4-3 5-4 6-6 7-5
0-0 1-1 2-2 3-3 4-4 5-5 6-6 8-7 9-9 9-8 10-10 11-11 12-12 12-12 13-13
0-1 1-1 2-2 3-3 4-0 4-4 4-0 4-4
0-0 1-1 2-2 3-4 3-3 4-3 4-4 5-3 5-4 6-3 6-4 7-4 7-3 8-4 8-3 9-5 10-5 11-6 7-4 7-3 8-4 8-3 8-4 8-3 9-5 10-5 11-6 12-7
0-0 1-0 3-1 5-2 5-3 6-5 6-4 6-6 7-6 7-4 7-5 8-7 9-8 7-6 7-4 7-5 7-6 7-4 7-5 7-6 7-4 7-5 8-7 9-8 10-9
0-0 1-0 2-1 3-2 4-3 5-4 7-5 8-7 8-6 9-8 10-9 10-9 12-10
0-0 1-1 2-2 3-3 4-4 5-5
0-3 0-2 0-1 1-0 2-4 3-5 4-6 5-7 6-7 7-9 6-7 7-9 8-8
0-0 1-1 2-3 2-2 3-2 3-3 4-3 4-2 5-4 6-5 7-6 8-7 9-8 10-9 11-11 12-10 10-9 11-11 12-10 13-12
也就说,出现了重复的情况。程序的源代码如下,请各位指出错误的地方:

/*******************************************        Sort any tpye array          *******************************/
/***************************************************************************************************************/
/*Author: TianLiang */
/*Time: 2012/02/29 */


/*Function: A template to sort any type of array */

//template <class Type> //Define a template
void CSortAlignmentPoints::BubbleSort(int Array[], int nLen)
{
int nTmp;
for(int i=0;i<nLen-1;i++) //冒泡法排序
{
for(int j=nLen-1;j>i;j--)//比较,找出本趟最小关节关键字的记录
{
if(Array[j]<Array[j-1]) //Exchange the data
{
nTmp=Array[j];//
Array[j] = Array[j-1];
Array[j-1]=nTmp;
}
}

}
//return Array[nLen];

}
void CSortAlignmentPoints::deleteElement(int Array[], int nLen)
{
current = 0;
for(int i=0;i<nLen-1;i++)//travel each element in the array
{
if(Array[i]!=Array[i+1])
{
Array[current]=Array[i];
current++;
}

}

}
/******************************************* Sort any tpye array *******************************/
/***************************************************************************************************************/
/*Author: TianLiang */
/*Time: 2012/02/29 */
/*Function: A template to sort any type of array */
CString CSortAlignmentPoints::SortBytheFirstNumber(CString alignmentPoints)
{
alignmentPoints.Trim();
CToken myToken;
int sortCount=myToken.Tokenize(alignmentPoints,_T(' '));//Get the count of the input
int *nArray= new int[sortCount];
for(int i=0;i<sortCount;i++)
{
CString alignPoints=myToken.getToken(i);//Get the ith string of the input
alignPoints.Trim();
int lenPos=alignPoints.Find(_T("-"));
CString sortLeft=alignPoints.Left(lenPos);


int changedAlign=_wtoi(sortLeft);//Change from string to int

nArray[i]=changedAlign;

}
//Sort the numbers in the array
BubbleSort(nArray,sortCount);
//Delete the repeat numbers in the array
deleteElement(nArray,sortCount);

CString alignResult=_T(""),finalResult=_T("");

for(int j=0;j<=current;j++)
{
int output = nArray[j];
CString result;
result.Format(_T("%d"),output);
for(int k=0;k<sortCount;k++)
{
CString finalAlign=myToken.getToken(k);//Get the ith string of the input
finalAlign.Trim();
int pos=finalAlign.Find(_T("-"));
CString left=finalAlign.Left(pos);
if(result == left)
{
finalResult += finalAlign +_T(" ");

}

}

}
//delete [] newArray;
delete [] nArray;// Free the memory
return finalResult;
}


非常感谢!
第二,您这current是个全局变量额,下次加个“m_”吧,目测排序、删除和组装这三个部分都没有太大问题,很大的可能出现在了current这个变量上,请仔细查一下是否在其他地方是否引用修改过,从结果上来看,current应该是被误修改过。

如果你不介意可以发全码给我,我给你调一下,好像这程序不是很大,虽然让我看起来好头疼排序后为何会出现重复呢
不过我不知道下次什么时候上线,排序后为何会出现重复呢
[解决办法]
自己定义一个类,然后重载其中的<、=操作符还有其他必须的成员函数,然后将你的排序函数int Array[]改成MyNumber Array[],当然你读入数据的代码也得改
我帮你实现下<号操作符吧,其他的你自己写

class MyNumber
{
MyNumber();
~MyNumber();
MyNumber(const Mynumber &rhs);
MyNumber &operator = (const MyNumber &rhs);
//上面函数自己实现
int GetLfet() const
{
return leftnumber;
};
int GetRight() const
{
return rightnumber;
}
bool operator < (const MyNumber &right) const
{
if(leftnumber < right.GetLeft())
return true;
else if(leftnumber == right.GetLeft())
{
if(rightnumber < right.GetRight())
return true;
else
return false;
}
else if(leftnumber > right.GetLeft())
return false;
}
private:
int leftnumber;
int rightnumber;
};

读书人网 >C++

热点推荐