基于频次数组升序排序数组,频次相同时按元素自身升序同步排序
解决同步排序并处理计数相同场景的方案
我完全get到你的需求啦——要让numsFoundedSorted和numsFoundedCount像Array.Sort那样同步排序,核心规则是先按numsFoundedCount的值从小到大排序,当两个元素的计数相同时,numsFoundedSorted里的对应元素要按自身数值从小到大排列。
下面以C#为例给你具体的实现方案,思路是先把两个数组的对应元素绑定在一起,排序后再拆分回原数组结构,操作起来直观又可靠:
步骤1:将数值与对应计数配对
我们可以用元组(也可以自定义类)把每个数值和它的计数关联起来,这样排序时就能保证两者始终同步:
// 假设这是你的原始数组 int[] numsFoundedSorted = {5, 2, 3, 2, 5}; int[] numsFoundedCount = {2, 2, 1, 2, 2}; // 将数值和计数一一配对成元组列表 var pairedItems = numsFoundedSorted.Zip(numsFoundedCount, (num, count) => (Number: num, Count: count)).ToList();
步骤2:自定义排序规则
对配对后的列表设置排序优先级:
- 第一优先级:按
Count从小到大排序 - 第二优先级:当
Count相同时,按Number从小到大排序
pairedItems.Sort((itemA, itemB) => { // 先比较计数大小 int countCompareResult = itemA.Count.CompareTo(itemB.Count); // 如果计数相同,再比较数值本身 if (countCompareResult == 0) { return itemA.Number.CompareTo(itemB.Number); } return countCompareResult; });
步骤3:拆分回原数组结构
把排序后的元组列表重新拆分成两个独立数组,就完成了同步排序:
numsFoundedSorted = pairedItems.Select(item => item.Number).ToArray(); numsFoundedCount = pairedItems.Select(item => item.Count).ToArray();
效果验证
比如你提到的示例场景,排序后numsFoundedSorted会严格遵循“先按计数升序,计数相同则按数值升序”的规则,完全符合你的预期。
如果你更习惯用Array.Sort的自定义比较器模式,也可以通过封装包含两个数组的比较器实现,但用元组配对的方式代码更简洁,逻辑也更容易理解。
内容的提问来源于stack exchange,提问作者CDrosos
相关产品推荐
相关产品推荐

