【问题标题】:How can i sort structure according to equal elements? [closed]如何根据相等的元素对结构进行排序? [关闭]
【发布时间】:2016-05-09 14:03:25
【问题描述】:

我的结构有 3 个 int 数组。像这样:


A[]:  1   2   3   4   5    6    7    8   9   10  11  12  13  14  15
B[]:  2   3   1   1   2    2    4    3   3   1   3   4   3   4   1
C[]:  40  20  50  70  130  100  170  70  60  20  20  20  20  20  70

我想根据两个标准对我的结构进行排序。

第一个是:增加C-Array

第二个是:为C-Array的每一个相等的元素增加B-Array。

排序后的数组一定是这样的:


A[]:  10  2   11  13  12  14  1   3   9   4   15  8   6    5    7  
B[]:  1   3   3   3   4   4   2   1   3   1   1   3   2    2    4    
C[]:  20  20  20  20  20  20  40  50  60  70  70  70  100  130  170

我用冒泡排序做了第一个标准,但第二个更复杂。

我该怎么做?

【问题讨论】:

  • 请展示您的研究成果。请先阅读How to Ask页面。
  • 在下一次编辑中它将有 4 个数组?

标签: c sorting struct


【解决方案1】:

在排序中决定元素顺序的关键因素是比较的结果,在你的例子中,比较首先基于比较数组B中的两个元素,只有当它们在数组B中相等时,才比较在数组 A 中。您可以像这样创建比较函数:

// A and B are two arrays, i and j are the two indexes for comparing
int compare(int i, int j) {
    if (C[i] < C[j]) return -1;
    else if (C[i] > C[j]) return 1;
    else { // compare in B
        if (B[i] < B[j]) return -1;
        else if (B[i] > B[j]) return 1;
        else return 0;
    }
}

然后您可以将此比较函数应用到您的排序函数中,方法是替换比较元素的位置,例如如果您有 if (C[i] &lt; C[j]) swap(...); 之类的代码,请改为使用 if (compare(i, j) &lt; 0) swap(...);

如果您使用标准 C 的 qsort 函数,则需要调整该函数以接受指向结构数组元素的指针。

【讨论】:

  • +1。如果您发布了一个如何将比较函数放入通用排序器的示例,例如qsort(),它可能会对 TC 有很大帮助。 TC 可能已经进行了“包装自己的”排序,并且您的比较函数的松散耦合模块化可能会被忽视/低估。
  • 你是对的,更新了我的答案。
  • 谢谢。但我改变了我的问题,因为首先我犯了错误。你能帮我这个表格吗?
  • @Waox 所以你的意思是 A 数组在排序时不考虑?
  • @Waox 功能基本相同,只是改变了数组名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
相关资源
最近更新 更多