【问题标题】:Bubble Sort so that all numbers ending in the digit 5 comes in ascending order冒泡排序,使所有以数字 5 结尾的数字按升序排列
【发布时间】:2015-02-01 04:02:49
【问题描述】:

我正在尝试实现一个整数数组的冒泡排序,以便所有以数字 5 结尾的数字首先出现(升序),然后是所有不以 5 结尾的数字(升序)。

冒泡排序前:[5, 1, 23, 45, 65, 89, -85, -76]

冒泡排序后(结束数字 5(升序)):[-85, 5, 45, 65, -76, 1, 23, 89]

所以我确实知道如何编写标准的冒泡排序,但我无法完全理解附加规则(以数字 5 结尾)。任何帮助表示赞赏。

谢谢

【问题讨论】:

  • 为什么排序后45没有移到前面?
  • Raskeshbs - 确实如此,我只是复制错误,抱歉!
  • 您有任何额外的要求/限制吗?例如,一切都需要在原始数组中完成吗?如果不是,一个简单但低效的方法是处理数组以使所有值都能被 5 整除并分别排序,然后对剩余的值进行排序,最后将两个结果放在一起。
  • James - 没有额外的要求或限制
  • 建议实施一个冒泡排序,该排序认为“数字&0x05== 0xx05”出现在不计算为上述表达式的数字之前。并且那个表达式占主导地位的实际值。这意味着更多的比较,而不仅仅是普通冒泡排序算法中的一个。

标签: c algorithm bubble-sort


【解决方案1】:

唯一需要改变的是比较代码。

假设冒泡排序代码正常工作并使用简单的比较,例如:

if (a < b) ...

如下创建函数。 a%10 将产生值 -9,-8,...,8,9。测试此结果何时为5-5。下面测试|a%10| == 5.

// Return 1 when a should come before b in the array.
int cmp5(int a, int b) {
  int a5 = abs(a%10) == 5;
  int b5 = abs(b%10) == 5;
  // Since a and b are the same "five-ness", do a simple compare
  if (a5 == b5) return a < b;
  if (a5) return 1;
  return 0;
  // Could replace above 2 lines with `return a5;`
}

然后打电话

 if (cmp5(a,b)) ...

【讨论】:

  • @James Adkison 感谢您对int b5 = ... 的更正,但建议编辑的其余部分与预期的顺序相反。
  • 除非我弄错了,当这个逻辑将它们按降序排序时,列表末尾的所有 5 的倍数?我想这取决于您对返回值的解释。返回 0 时冒泡排序算法应该怎么做?
  • @James Adkison 前提是看不见的代码有一个排序顺序(假设是升序),取决于 (a &lt; b)cmp5(a,b) 替换它。如果cmp5(a,b) 极性相反,OP 肯定会使用!cmp5(a,b) 或根据需要定制代码。另外:这不是“5 的倍数”问题,而是“以数字 5 结尾的数字”问题。感谢您的仔细审查
  • 是的,感谢您指出我对“以 5 结尾”的疏忽。我相信我删除了我的答案。
【解决方案2】:

正如您所说,您知道标准冒泡排序,现在可以执行以下操作

  1. 取两个数组/向量(你喜欢的那个)
  2. 1 表示 5 的倍数,其他表示余数

  3. 现在只需制作标准冒泡排序函数bubblesort(array[])

  4. 过滤两个数组的输入

  5. 过滤后调用冒泡排序即可完成
  6. 然后将两个结果放在一起

【讨论】:

  • 结合这两个数组的最佳方法是什么?
  • 你可以制作array.push(),但是由于索引的限制你会遇到一些问题(如果数组大小太长)所以使用向量可以克服这一步
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多