1、先来一段正常的选择排序代码,用它来做拿到oj题(懒虫小鑫)结果是Time Limit Exceeded,(题目要求对运算时间比较严格,所以才没AC,这段代码是正确的),因为一次i循环就可能交换好几次数据,所以运算时间会长,结果就是超出时间限制。(注:t是与s相同的结构体类型)
for(i = 0; i < n-1; i++)
{
f = 1;//标记是否有数据交换,提高效率;
for(j = i+1; j < n; j++)
{
if(s[i].w>s[j].w)
{
t = s[i]; s[i] = s[j]; s[j] = t;
f = 0;
}
if(s[i].w==s[j].w&&s[i].p<s[j].p)
{
t = s[i]; s[i] = s[j]; s[j] = t;
f = 0;
}
}
if(f)break;
}
2、稍微改变一下就会不一样,下面一段代码是AC的代码,效率要比上面一段代码高,原因是它执行一个i循环只需交换一次数据,所以运算速度要快。
for(i = 0; i < n-1; i++)
{
f = i;//标记是否有数据需要交换
for(j = i+1; j < n; j++)
{
if(s[f].w>s[j].w)
{
f = j;
}
if(s[f].w==s[j].w&&s[f].p<s[j].p)
{
f = j;
}
}
if(f!=i)
{t = s[i]; s[i] = s[f]; s[f] = t;}
}