这是我朋友编程课程中的一个问题。
问。如何对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;
}
}
}
我后来自己尝试了这个(这就是上面的代码) - 当我尝试这个时,我认为这可以通过使用更少的代码,更有效率来实现。可能是我提出了错误的建议。
有什么想法吗?
答案 0 :(得分:8)
答案 1 :(得分:2)
修改后的合并排序可以解决这个问题:在最后一次合并传递中跟踪你在结果数组前面推送的最后一个数字,如果下一个数字中最低的数字相等则添加到结尾而不是前面
答案 2 :(得分:1)
欢迎来到数据结构和算法的世界。你是完全正确的,你可以更快地排序。你也可以用十几种不同的方式做到这一点。 PHD用于这些东西:)
这是一个链接,您可以在其中看到优化的bubble sort
您可能还想查看Big O Notation
玩得开心,祝你好运!
答案 3 :(得分:1)
使用quicksort对数组进行排序。实现排序时,您可以通过将所有重复项添加到单独的重复数组来稍微修改它。完成后,只需将重复数组附加到已排序数组的末尾。