仅使用 3 个元素对 int 数组进行排序

Posted

技术标签:

【中文标题】仅使用 3 个元素对 int 数组进行排序【英文标题】:sorting int array with only 3 elements 【发布时间】:2011-06-15 03:53:08 【问题描述】:

我有这个数组:

int [] myarray =  17, 6, 8;

用伪代码对该数组进行排序的最佳方法是什么?

谢谢!

【问题讨论】:

sorted(a) 和我的伪 sorted 函数就地排序:) 许多重复项,例如***.com/questions/3319993/… 简单:int [] myarray = 6, 8, 17; :) 【参考方案1】:

此代码在最坏的情况下进行 2 或 3 次比较和 4 条内存记录,而不是另一个答案(在最坏的情况下总是 3 次比较和 9 条内存记录)。

if a[0] < a[1]:
    if a[1] > a[2]:
        if a[0] < a[2]:
            temp = a[1]
            a[1] = a[2]
            a[2] = temp
        else:
            temp = a[0]
            a[0] = a[2]
            a[2] = a[1]
            a[1] = temp
    else:
        # do nothing
else:
    if a[1] < a[2]:
        if a[0] < a[2]:
            temp = a[0]
            a[0] = a[1]
            a[1] = temp
        else:
            temp = a[0]
            a[0] = a[1]
            a[1] = a[2]
            a[2] = temp
    else:
        temp = a[0]
        a[0] = a[2]
        a[2] = temp

【讨论】:

我会给你+1,adamax。虽然读起来很丑,但问题确实要求最佳,而你的问题似乎满足:-) 您的算法使用 2, 3, 1 数组产生不正确的结果。 @ionree 当然,我修复了代码。如果您查看the original code,您会发现执行路径最终会交换两个元素,而每个元素都必须移动。 轻微优化:如果a[0]==a[1]`,将第一个&lt; 比较替换为=&lt; 将避免不必要的交换。【参考方案2】:

May this graphic 显示用于对三个元素进行排序的决策树有助于:

【讨论】:

这是出自哪本书? 这是来自 Volker Heun 的“Grundlegende Algorithmen”(www14.in.tum.de/~ga)——不幸的是只有德语。在 Cormen 等人 (mitpress.mit.edu/books/introduction-algorithms) 的“算法简介”中可以找到一个非常相似的图。 我知道我在什么地方见过它……也许它也在 Sedgewick 的书中?但对于其他想知道它确实在 CLRS 中的人来说,在“线性时间排序”下。谢谢!【参考方案3】:

比展开的冒泡排序稍微高效一些,不是最优的,但仍然很简单

if (el1 > el2) Swap(el1, el2)
if (el2 > el3) 
   Swap(el2, el3)
   if (el1 > el2) Swap(el1, el2)

【讨论】:

我不敢相信有人投了反对票。它在–1。我刚刚投了赞成票,现在它是 0。【参考方案4】:

我认为这应该很快(升序):

if (el1 > el2) Swap(el1,el2)
if (el2 > el3) Swap(el2,el3)
if (el1 > el2) Swap(el1,el2)

【讨论】:

您的经典展开冒泡排序 :-) +1。

以上是关于仅使用 3 个元素对 int 数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何对包含空元素的对象数组进行排序?

使用 2 个其他数组对数组进行排序

使用线性时间算法对仅包含 3 个字母的数组中的 2 个字母字符串进行排序

冒泡排序(面试题)

java数组排序

编写一个sort函数,对一维数组的前n个元素从小到大排序