Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找数组中最大的三个元素_Algorithm_Sorting_Time Complexity_Big O_Bubble Sort - Fatal编程技术网

Algorithm 查找数组中最大的三个元素

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++){

样本输入:[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++){
               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)+单次遍历中实现答案。只需使用三个变量并迭代数组。主要任务是在循环内实现比较器。做一些笔墨工作很容易。