我正在进行一项关于排序算法的练习。实际练习的结构如下:
给定N个实数的序列,找到值相距最远的整数对。给出O(N)算法。用英语描述您提出的算法。
目前我不熟悉任何线性排序算法,所以我想在这里询问一下。是否有特定类型的排序算法在这种情况下最有效?如果是这样,它是什么以及该特定算法如何工作?
谢谢!
答案 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;