小编mol*_*bel的帖子

通过反转子列表对列表进行排序的最佳方法

现在我最近看到了这个问题(不记得在哪里)关于通过专门反转子列表对数字列表进行排序需要多少操作。

这是一个示例:
未排序的输入3, 1, 2, 5, 4

可能的答案之一是:
1. 反向索引 0 到 3,给出5, 2, 1, 3, 4
2. 反向索引 0 到 4,给出4, 3, 1, 2, 5
3. 反向索引 0 到 3,给出2, 1, 3, 4, 5
4. 反向索引 0 到 1,给出1, 2, 3, 4, 5

然而,在尝试解决这个问题之后,事实证明对于没有算法经验的人来说,实际上很难创建一段找到最佳解决方案的代码。上面提到的答案只是通过强制所有可能的组合来完成,但是当列表超过 10 个数字时,这会变得非常慢(10 个数字 <2 秒,14 个数字超过 10 分钟)。重新调整任何现有的排序算法也不起作用,因为它们被构建为一次只交换单个元素(并且通过反转子列表来交换 2 个数字将需要 1-2 次操作,这根本不是最佳的)。我也尝试过对网络进行排序,因为在运行程序之前已经确定了最大大小,但是我也没有太多运气(它们也依赖于交换,当您能够一次交换多个时,这是低效的)。我还尝试制作一个可以“优化”一系列操作的函数,以尝试使现有的排序算法可行,但这些答案也比最佳答案长得多(想想 16 对 6)。

因此,在花了相当多的时间之后,我找不到更好的方法来找到最短的解决方案,而不是强制执行它。作为一名学生,我在排序、算法和其他数学“魔法”方面没有太多经验,但我想知道这里是否有人可以尝试一下。最好的答案当然只是给出一个提示,因为我不介意尝试通过 StackOverflow 周围漂浮的更聪明的思想的一些提示来解决它。

假设所有数字都是唯一的,并且在 0 - 100 的范围内(两者都是独占的)。数组的长度类似于3 < N < 15,因为我似乎记得原来的问题也不使用大数组。

arrays sorting algorithm reverse

8
推荐指数
1
解决办法
1528
查看次数

C++ 标准是否对获取数组索引表达式的地址提供任何保证?

具体来说,考虑以下代码:

uint8_t my_array[3] = { 1, 2, 3 };
uint8_t *my_array_a = my_array;
uint8_t *my_array_b = nullptr;

uint8_t *my_element1 = &my_array_a[0];
uint8_t *my_element2 = &my_array_b[0];
Run Code Online (Sandbox Code Playgroud)

请注意,这些类型都没有什么特殊之处operator&operator*

如果这是 C,则标准保证my_array_b + 0在计算期间不会取消引用my_element2(来自 ISO/IEC 9899:TC2,运算符的语义&):

类似地,如果操作数是运算符的结果[],则不会计算运算符或the 隐含的&一元,结果就像删除了运算符并将 the更改为运算符一样。*[]&[]+

C++ 标准是否提供类似的保证(至少对于给定的场景),或者以my_element2这种方式进行计算在技术上是未定义的行为,因为它涉及取消引用nullptr

据我所知,上面的代码片段中没有隐藏的 UB。强制转换nullptrtouint8_t*是合法的,并且nullptr + 0被明确定义为 Yieling nullptr。诚然,这个样本也不是很有用,但无论如何我们都是在做规则律师。

这个问题类似于通过下标获取最后一位数组元素的地址:C++标准是否合法?,但我特别感兴趣的是 C++ 中是否也存在&[]->+ …

c++ language-lawyer

5
推荐指数
0
解决办法
164
查看次数

标签 统计

algorithm ×1

arrays ×1

c++ ×1

language-lawyer ×1

reverse ×1

sorting ×1