Java 按线性(O(N))时间排序数组

Java 按线性(O(N))时间排序数组,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,我正在做一个关于排序算法的练习。实际练习的结构如下所示: 给定一个由N个实数组成的序列,找出值相差最远的一对整数。给出一个O(N)算法。用英语描述你提出的算法 我目前不熟悉任何线性排序算法,所以我想在这里询问一下。在这种情况下,是否有一种特定类型的排序算法最有效?如果是这样的话,它是什么?这个特定的算法是如何工作的 谢谢 您无需排序。你所要做的就是找到数字列表的最小值,它需要O(N),然后找到数字列表的最大值,它同样需要O(N)。在O(N)时间内不可能对列表中的所有元素进行排序。它将花费最少的O

我正在做一个关于排序算法的练习。实际练习的结构如下所示:

给定一个由N个实数组成的序列,找出值相差最远的一对整数。给出一个O(N)算法。用英语描述你提出的算法

我目前不熟悉任何线性排序算法,所以我想在这里询问一下。在这种情况下,是否有一种特定类型的排序算法最有效?如果是这样的话,它是什么?这个特定的算法是如何工作的


谢谢

您无需排序。你所要做的就是找到数字列表的最小值,它需要O(N),然后找到数字列表的最大值,它同样需要O(N)。

在O(N)时间内不可能对列表中的所有元素进行排序。它将花费最少的O(n log(n))时间

但是,这个问题不需要对所有元素进行排序,只需要对其中的两个元素进行排序


只需在列表上迭代一次,并保留最大值和最小值。

正如所指出的,您只需要找到最小值和最大值。显然,您可以分别找到它们,需要O(n),确切地说,需要2*n比较。但在CLR中,您可以做得更好,通过同时查找min和max,将比较次数减少到1.5*n。其思路如下:

1) 初始化最小值=a[0],最大值=a[0]

2) 对于i=1到n-1,比较a[i]和a[i+1]。然后进行相应的比较和更新:
min(a[i],a[i+1])与min;max(a[i],a[i+1])与max.

这是您需要的:

public class MinMax {
    public static void main(String[] args) {
        int numberarray[] = { 5, 6, 8, 1, 3, 5, 4, 6, 9, 4, 2, 3, 4, 7, 9, 6 };
        int min, max;
        min = max = numberarray[0];

        for (int i = 0; i < numberarray.length; i++) {
            if (numberarray[i] < min)
                min = numberarray[i];
            if (numberarray[i] > max)
                max = numberarray[i];
        }       
        System.out.println("The pair farthest apart is ( "+max+" , "+min+" )");
    }
}
公共类最小值{
公共静态void main(字符串[]args){
int numberarray[]={5,6,8,1,3,5,4,6,9,4,2,3,4,7,9,6};
最小整数,最大整数;
最小值=最大值=数值射线[0];
for(int i=0;imax)
max=numberarray[i];
}       
System.out.println(“相距最远的一对是(“+max+”,“+min+”));
}
}
我正在用Java编写

int min=整数最大值; int max=整数的最小值

对于(int i=0;i
if(a[i]=a[i+1]
如果(a[i+1]max)max=a[i];
}
}


因此,比较的总数是1.5*n;

您不需要对任何内容进行排序。您不能在线性时间内进行排序。您可以在线性时间内解决上述问题。因此不需要排序?那么我如何遍历该数组并找到答案?这是否意味着我只需要在数组中找到最小值和最大值?在搜索数组并找到最大的数字。在遍历数组时,检查每个数字是迄今为止找到的最小的还是迄今为止看到的最大的,或者两者都不是。如果仔细想想……这对数字“在值上相距最远”必须是最小值和最大值。突然意识到它提到所有数字都是实数,然后要求值相距最远的整数…什么?不是真的。基数排序可以在线性时间内对数字列表进行排序。是的,但特别提到它是实数数组,基数排序只适用于int(或定点)。噢,我很抱歉。我没有考虑到这点。@Solace:从技术上讲,在RAM模型(算法分析中最常用的一种)中,基数排序是
O(n*w)
其中
w
是单词大小。您的第2步不清楚(我怀疑这是错误的)。请完整写出这些陈述。@StephenC请看我的新答案。这是正确的。但是,您需要处理
a.length
是奇数的情况。此外,在保存0.5N比较的同时,(循环变量额外保存0.5N…)还有更多的算法。所以我认为你需要对其进行基准测试,以了解实际的性能优势是什么。你是对的,我需要处理的情况n也很奇怪。但是我不明白你的第二点,即需要对这种方法进行基准测试以了解实际的优势?重点是,量化实际性能比韩只是在计算比较。(尤其是因为你并没有真正计算所有的比较……我怀疑)我明白你的观点,我也同意你的观点,例如,我们必须分析如何检索和读取数据。但是对于这段简单的代码,分析应该非常简单,你不同意吗?不,事实上,我不同意。真正的性能将由JIT编译器发出的本机代码决定,甚至由缓存内存之类的东西决定y行为。给出与实际测量性能密切相关的答案的分析确实需要非常复杂……即使是一段简单的代码。相比之下,“大O”分析工作忽略了实际性能问题,并将重点放在理论可伸缩性上;即,当伸缩变量趋于无穷大时,成本函数的预测行为。
   if(a[i]<a[i+1]){ 
      if(a[i]<min) min=a[i];
      if(a[i+1]>max)max=a[i+1];
   }

   else{//a[i]>=a[i+1]
      if(a[i+1]<min) min=a[i+1];
      if(a[i]>max)max=a[i];

    }