c++ - 自定义排序,总是强制 0 到升序后面?

标签 c++ sorting

前提

这个问题有一个已知的解决方案(实际上如下所示),我只是想知道是否有人有更优雅的算法或任何其他想法/建议来使这个问题更具可读性、效率或健壮性。

背景

我有一个体育比赛列表,需要按数组排序。由于这个数组人口的性质,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/

相关文章:

c++ - (简单 C++)从文件中获取带有 vector 的矩阵

javascript - 哪种类型的排序算法与此代码最相似? (如果有的话)。

ios - 如何根据键对数组进行排序?

java - 正确排序集合中的相等项目

c++ - 为什么 C++ 禁止这种部分特化?

c++ - GL_TRIANGLES 而不是 GL_QUADS

c++ - 动态 Actor - 两者之间的区别

c++ - 计算一个十六进制数的位数

algorithm - 寻找某些数组最快的排序算法

c - 冒泡排序问题