【问题标题】:Array sorting effective数组排序有效
【发布时间】:2012-05-26 15:56:43
【问题描述】:

对于家庭作业,我需要编写可以对数组进行排序的方法,排序方法应该尽可能高效。

  1. 数组的开头将出现所有除以 4 的数字,没有余数。
  2. 后面是所有除以 4 余数为 1 的数字
  3. 后面是除以 4 余数为 2 的所有数字
  4. 所有其他数字(除以四除以其余三的数字)位于数组的末尾。

我试过这组 4 个指针:
2个指针起初0和1的余数
数组最后的 2 个指针,用于 2 和 3 的余数

这是我目前能找到的(当然有问题),感谢您的帮助!

public static void sortByFour (int[] arr)
{
    int temp;
    int noRemainderIndex = 0;
    int remainder1Index = 1;
    int remainder2Index = arr.length - 2;
    int remainder3Index = arr.length - 1;

    for (int i = 0; i < arr.length; i++)
    {
        if (arr[i] % 4 == 0)
        {
            temp = arr[noRemainderIndex];
            arr[noRemainderIndex] = arr[i];
            arr[i] = temp;
            noRemainderIndex++;
            remainder1Index++;
        }
        else if (arr[i] % 4 == 1)
        {
            temp = arr[remainder1Index];
            arr[remainder1Index] = arr[i];
            arr[i] = temp;
            remainder1Index++;
        }
        else if (arr[i] % 4 == 2)
        {
            temp = arr[remainder2Index];
            arr[remainder2Index] = arr[i];
            arr[i] = temp;
            remainder2Index--;
        }
        else if (arr[i] % 4 == 3)
        {   
            temp = arr[remainder3Index];
            arr[remainder3Index] = temp = arr[i];
            arr[i] = temp;
            remainder3Index--;
            remainder2Index--;
        }
    }

【问题讨论】:

  • 数字之间的顺序除以4的余数相同吗?
  • 您可以使用Array.sort 方法吗?
  • 无需整理
  • 不,我需要自己写,这应该是一个节省空间和时间的地方

标签: java arrays performance sorting


【解决方案1】:

作业提示。

  1. 如果允许您使用现有的库方法,请查看Array.sort(...)Comparator 接口。 (注意,在对原始类型的数组进行排序时,要使用自定义比较器,您必须先转换为包装器类型;例如,将 int[] 转换为 Integer[],排序,然后再转换回来。)

    李>
  2. 如果不允许您使用Array.sort(...)(或类似名称),请确定这是排序问题还是整理问题。换句话说,如果有任何要求对 4 个类别中的数字进行重新排序(或保留顺序)。

  3. 您可以通过使用 4 个临时数组来简化问题,但还有其他(更棘手的)解决方案涉及多次遍历数组和交换元素对。

  4. 需要解决的问题之一是您事先不知道 4 个类别中的每个类别有多少个数字。所以你事先不知道移动数字的目的地。但是有解决方案...


...排序方法应该尽可能高效。

这是作业要求,还是您的要求?

如果这是您自己添加的内容 - 注意 - 您的标记可能比(假设)更有效但过于复杂的简单解决方案给出更高的分数解决方案。

优秀的软件工程师不会在每个程序中都追求极致的效率。相反,他平衡了各种事情:

  • 功能要求,
  • 性能要求,
  • 对软件可维护性的要求,以及
  • 项目截止日期,

注意其中一些要求可能是隐含的,和/或管理层未正确理解。

(或者换句话说,一个快速的程序......但不能可靠地工作,或者不可维护,或者没有及时准备好......是失败的。)

另一方面,如果性能是这个家庭作业的要求,那么你的讲师应该已经解释了如何用 Java 衡量小程序的性能。 (相信我……这不是一件简单的事情。)你需要把它应用到你的作业问题上,以决定哪种替代解决方案最快。

【讨论】:

  • 请注意,比较器只能比较对象。 int[] 数组必须转换为 Integer[]、排序并转换回 int[]。
【解决方案2】:

我想你想要一些类似于快速排序中使用的分区算法的东西。

4 指针是一个好的开始,但让我改变它们的功能:
1) 指向余数的结尾 = 0
2) 指向余数的结尾 = 1
3) 指向余数的结尾 = 2
4) 指向未分类的开始

数组分为 5 部分:余数 = 0、1、2、3 和未分类。

如果余数 = 3,只需增加指针 4。如果包含在余数 = 3 组中的数字。
如果余数 = 2,则递增指针 3 并将当前值与指针 3 处的值交换。递增指针 4。
如果余数 = 1,则增加指针 2,与当前值交换;增加指针 3,与当前值交换。递增指针 4.
如果余数 = 0,那么,交换 3 次。

【讨论】:

    【解决方案3】:

    我认为更好的方法是使用 4 个数组,每种情况一个。将每个数组视为一个队列。遍历数组并推送到相应的数组上。完成后,只需将数组彼此附加。一个非常干净的解决方案。

    【讨论】:

    • 如果我想使用更多的数组,我需要计算复杂度,因为它应该是有效的
    【解决方案4】:

    为什么不创建一个包含两个值的自定义类,即数字和余数。创建这个迷你类的数组,传递值并预先计算余数。这将帮助您不必在每次通过列表元素时重新计算余数。您必须根据剩余属性移动和排序元素。

    然后,您遇到了一个经典问题,即对只有少数独特元素的列表进行排序。您选择的排序算法的性能取决于初始条件。我可能会说最好的选择是 Shell 排序算法或 Quick3。

    http://www.sorting-algorithms.com/few-unique-keys

    【讨论】:

    • 不确定实例化一个类是否只是为了避免一些模计算会更有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2015-01-15
    • 2015-05-07
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多