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

时间:2019-08-10 03:11:13

标签: algorithm sorting time-complexity big-o bubble-sort

  

示例输入:[141、1、17,-7,-17,-27、18、541、8、7、7]

     

示例输出:[18、141、541]

我的代码

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

我认为我可以进行3次冒泡排序,因为我只关心3个最大的元素,然后退出。我知道传统的冒泡排序算法是O(N ^ 2)。但是,由于我的while循环仅运行3次,而我的for循环针对N个元素运行,因此我的修改后的算法是否具有更好的O(N)时间复杂度,因此O(N)?

我只需要帮助了解时间上的复杂性,而不是很简单的解决方案即可。

1 个答案:

答案 0 :(得分:2)

是的,是的,您的算法进行了3N个比较,并且复杂度为O(N)

这比完全冒泡排序更好,因为算法仅执行部分排序,其余部分仍未排序。

但是请注意,对于固定个最大元素(此处为3),复杂度是线性的。如果您需要选择n/3个最大的排序方式-这种方法将变成二次方,而您会选择另一种部分排序方式(例如,基于Quicksort分区的算法或二进制堆之一)