在线性(O(N))时间内对数组进行排序

时间:2014-03-03 22:03:44

标签: java arrays algorithm sorting

我正在进行一项关于排序算法的练习。实际练习的结构如下:

  

给定N个实数的序列,找到值相距最远的整数对。给出O(N)算法。用英语描述您提出的算法。

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

谢谢!

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

但是,此问题不需要排序所有元素,只需要其中两个元素。

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

答案 2 :(得分:1)

正如所指出的,你只需要找到最小值和最大值。显然你可以单独找到它们,它需要O(n),确切地说它需要2 * n比较。但是在CLRS中你可以做得更好,通过同时找到min,max来将比较次数减少到1.5 * n。这个想法如下:

1)初始化min = a [0],max = a [0]

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

答案 3 :(得分:0)

这就是你需要的:

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+" )");
    }
}

答案 4 :(得分:0)

我用Java写作。

int min = Integer.MAX_VALUE; int max = Integer.MIN_VALUE;

for(int i = 0; i

   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];

    }

}

所以比较的总数是1.5 * n;