在将重复项移动到最后时对数组进行排序?

时间:2011-08-30 02:14:47

标签: java algorithm sorting duplicates

这是我朋友编程课程中的一个问题。

问。如何对int数组进行排序,然后排列它们,使所有重复元素出现在数组的末尾?

例如,给定输入

{5, 2, 7, 6, 1, 1, 5, 6, 2}

输出为

{1, 2, 5, 6, 7, 1, 2, 5, 6}

请注意,数字已排序,重复的数字在7之后,这是数组中的最大值。

必须使用任何Java库包/ utils 来实现

我建议先使用插入或冒泡排序对数组进行排序,然后遍历数组,执行以下操作:

for (int i = 0; i < nums.length - 2; i++) {
    for (int j = i + 1; j < nums.length; j++) {
        //current and next are same, move elements up
        //and place the next number at the end.
        if (nums[i] == nums[j]) {
            int temp = nums[j];
            for (int k = j; k < nums.length - 1; k++) {
                nums[k] = nums[k + 1];
            }
            nums[nums.length - 1] = temp;
            break;
        }
    }
}

我后来自己尝试了这个(这就是上面的代码) - 当我尝试这个时,我认为这可以通过使用更少的代码,更有效率来实现。可能是我提出了错误的建议。

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

答案 1 :(得分:2)

修改后的合并排序可以解决这个问题:在最后一次合并传递中跟踪你在结果数组前面推送的最后一个数字,如果下一个数字中最低的数字相等则添加到结尾而不是前面

答案 2 :(得分:1)

欢迎来到数据结构和算法的世界。你是完全正确的,你可以更快地排序。你也可以用十几种不同的方式做到这一点。 PHD用于这些东西:)

这是一个链接,您可以在其中看到优化的bubble sort

您可能还想查看Big O Notation

玩得开心,祝你好运!

答案 3 :(得分:1)

使用quicksort对数组进行排序。实现排序时,您可以通过将所有重复项添加到单独的重复数组来稍微修改它。完成后,只需将重复数组附加到已排序数组的末尾。