所以我在java中正在研究这种排序算法,并且想知道是否有人之前已经看过这样的事情。具体来说,该算法用于对具有非常小的数字范围的非常大的列表进行排序。如果你已经看到或有任何建议来增强算法,你能在下面说些什么吗?我在这里有代码:
public static int[] sort(int[] nums)
{
int lowest = Integer.MAX_VALUE;
for (int n : nums)
{
if (n < lowest)
lowest = n;
}
int index = 0;
int down = 0;
while (index < nums.length)
{
for (int i = index; i < nums.length; i++)
{
if (nums[i] == lowest)
{
int temp = nums[i] + down;
nums[i] = nums[index];
nums[index] = temp;
index++;
}
else
nums[i]--;
}
down++;
}
return nums;
}
答案 0 :(得分:1)
如果我没弄错的话,那就是你的标准问题BubbleSort。它实现起来很简单,但性能很差:O(n ^ 2)。注意两个嵌套循环:随着数组大小的增加,算法的运行时间将呈指数级增长。
它被命名为冒泡排序,因为最小的值会&#34;冒泡&#34;到阵列的前面,一次一个。您可以阅读更多相关信息on Wikipedia。
答案 1 :(得分:0)
因此算法似乎有效,但它在这个过程中做了很多不必要的工作。
基本上你需要在添加x之前减去x次数并尝试交换它,其中x是数组中数字和最小数字之间的差值。以[99,1]为例。使用您的算法,您将在第一个for循环迭代中将数组更新为[98,1],然后接下来您将进行交换[1,98],然后您必须再进行97次迭代以使您的down变量达到98并将您的数组设置为[1,1]状态,然后向其添加98并将其与自身交换。它确实是一种有趣的技术,但效率不高。
任何给定作业的最佳算法实际上取决于您对数据的了解。查看其他排序算法,以了解他们做什么以及他们为什么这样做。确保您完成所做的算法,并尝试摆脱不必要的步骤。
为了首先增强算法,我将摆脱找到集合中的最低值并删除加法和减法步骤。如果您知道您的数字在给定范围内都是整数,请查看存储桶排序,否则您可以尝试合并或快速排序算法。