|
|
话说这题前前后后每周大概抽两个小时来搞这题,未怀疑过评测系统出问题,因为我看见老师过了。 前前后后拖了一个月的时间。
放上最终的代码:
|
|
下面详细说说这道题碰见的事情。
1、排序算法的选取
一开始并没有太在意这道题有什么特别之处,感觉特别平常的一道题,想想冒泡太慢,快排不熟悉,于是选择了相对简单的选择排序。
提交了好几次发现问题,选择排序并不能保证:“若首字母相同,则直接维持原来的顺序。” (排序的稳定性)
下面是反例: 数据为: wjbzbmr wa ac orz tle 如果是选择排序最后的结果会变成: ac orz tle wa wjbzbmr
于是果断滚回去用了冒泡,结果直接用冒泡会超时,这是字符串复制照成的(代码如下)。
|
|
刚开始没有思考是什么原因造成的,马上开始着手使用快排。
猛然想到,快排和选择排序一样,会造成上面反例的结果。所以当时瞬间傻了一阵子。
后来想到,即使冒泡没有花多少时间,但是主要时间则花在了交换两个字符串上。
所以,开始采用地址的做法。
|
|
上面的做法直接在函数内申请了char temp_str[1000][100000];直接导致栈溢出。
所以后来改成了动态内存分配的方法。
|
|
得到了最终的代码。
2、数据构造
但是这TNND死活就不过,十个测试数据,对两个,其他八个属于运行错误。
然后被这个错误折腾了半个月,今天终于知道了,原来我代码是正确的,错在评测系统。
构造了一个极限数据:1000*10000的数据包。
使用下面的程序来造数据:
|
|
运用重定向来测试到底会运行多长时间:
用下面这条语句来测试运行时间:
|
|
直接在冒泡内进行字符串的交换,所花时间为:1702ms
使用指针排序所花的时间为:163ms
评测系统允许的时间最大为1s,显然是对的。
然后我就不说什么了。以后还是要有自身判断正误的能力。