Algorithm 查找数组中最大的三个元素
样本输入:[141,1,17,-7,-17,-27,18541,8,7,7] 样本输出:[18141541] 我的代码Algorithm 查找数组中最大的三个元素,algorithm,sorting,time-complexity,big-o,bubble-sort,Algorithm,Sorting,Time Complexity,Big O,Bubble Sort,样本输入:[141,1,17,-7,-17,-27,18541,8,7,7] 样本输出:[18141541] 我的代码 class Program { public static int[] findThreeLargestNumbers(int[] array) { int j = array.length; while(j>= array.length-3){ for(int i = 0; i<j-1; i++){
class Program {
public static int[] findThreeLargestNumbers(int[] array) {
int j = array.length;
while(j>= array.length-3){
for(int i = 0; i<j-1; i++){
if(array[i]>=array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
j--;
}
int [] result = new int [3];
result[0] = array[array.length-3];
result[1] = array[array.length-2];
result[2] = array[array.length-1];
return result;
}
}
类程序{
公共静态int[]findThreeLargestNumbers(int[]数组){
int j=数组长度;
而(j>=array.length-3){
for(int i=0;i=array[i+1]){
int temp=数组[i];
数组[i]=数组[i+1];
阵列[i+1]=温度;
}
}
j--;
}
int[]结果=新的int[3];
结果[0]=数组[array.length-3];
结果[1]=数组[array.length-2];
结果[2]=数组[array.length-1];
返回结果;
}
}
我想我可以做3次冒泡排序,因为我只关心3个最大的元素,然后退出。我知道传统的冒泡排序算法是O(N^2)。然而,由于我的while循环只运行了3次,而我的for循环运行了N个元素,因此我的改进算法的时间复杂度是O(N)吗
我只需要帮助理解这个问题的时间复杂度,而不是非常简单的解决方案。是的,你是对的,你的算法进行了大约
3N
比较,并且具有O(N)
复杂度
它比完全冒泡排序好,因为algo只执行部分排序,其余的保持未排序
但请注意,对于固定的最大元素数(此处为3),复杂性是线性的。如果您需要选择最大的一个,比如说
n/3
,这种方法会变成二次排序,您更愿意选择另一种部分排序(例如,基于快速排序分区或二进制堆的algo)另一种解决方案可能是构建max heap
,下一个最大的剩余元素始终位于顶部。构建堆需要O(n*lg(n))
,每次删除顶部元素都需要O(lg(n))
。是的,但是会占用额外的空间吗?在我的例子中,我有恒定的时空复杂度。不,你的数组将转换为最大堆,然后你可以应用pop操作。你的代码是完美的。您还可以在O(n)+单次遍历中实现答案。只需使用三个变量并迭代数组。主要任务是在循环内实现比较器。做一些笔墨工作很容易。