前提
这个问题有一个已知的解决方案(实际上如下所示),我只是想知道是否有人有更优雅的算法或任何其他想法/建议来使这个问题更具可读性、效率或健壮性。
背景
我有一个体育比赛列表,需要按数组排序。由于这个数组人口的性质,95% 的时间列表将被预排序,所以我使用改进的冒泡排序算法对其进行排序(因为它接近 O(n) 与几乎排序的列表)。
冒泡排序有一个名为 CompareCompetitions 的辅助函数,它比较两个竞赛,如果 comp1 更大则返回 >0,如果 comp2 更大则返回 <0,如果两者相等则返回 0。比赛首先按优先级字段进行比较,然后按比赛开始时间进行比较,然后按主队名称进行比较。
优先级字段是解决这个问题的诀窍。它是一个包含正值或 0 的 int。它们按 1 排在第一位,2 排在第二位,依此类推,但 0 或无效值始终排在最后。
例如优先事项列表
0, 0, 0, 2, 3, 1, 3, 0
将被排序为
1, 2, 3, 3, 0, 0, 0, 0
另一个小怪癖,这对问题很重要,是 95% 的时间,优先级将是默认值 0,因为它只有在用户想要手动更改时才会更改排序顺序,很少见。所以比较函数中最常见的情况是优先级相等且为0。
代码
这是我现有的比较算法。
int CompareCompetitions(const SWI_COMPETITION &comp1,const SWI_COMPETITION &comp2)
{
if(comp1.nPriority == comp2.nPriority)
{
//Priorities equal
//Compare start time
int ret = comp1.sStartTime24Hrs.CompareNoCase(comp2.sStartTime24Hrs);
if(ret != 0)
{
return ret; //return compare result
}else
{
//Equal so far
//Compare Home team Name
ret = comp1.sHLongName.CompareNoCase(comp2.sHLongName);
return ret;//Home team name is last field to sort by, return that value
}
}
else if(comp1.nPriority > comp2.nPriority)
{
if(comp2.nPriority <= 0)
return -1;
else
return 1;//comp1 has lower priority
}else /*(comp1.nPriority < comp2.nPriority)*/
{
if(comp1.nPriority <= 0)
return 1;
else
return -1;//comp1 one has higher priority
}
}
问题
如何改进这个算法?
更重要的是……
有没有更好的方法强制0到排序顺序的后面?
我想强调这段代码似乎工作得很好,但我想知道是否有任何人可以建议更优雅或更有效的算法。请记住,nPriority 几乎始终为 0,比赛通常按开始时间或主队名称排序,但优先级必须始终优先于其他两个。
最佳答案
不就是这个吗?
if (a==b) return other_data_compare(a, b);
if (a==0) return 1;
if (b==0) return -1;
return a - b;
关于c++ - 自定义排序,总是强制 0 到升序后面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1132175/