示例输入:[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)?
我只需要帮助了解时间上的复杂性,而不是很简单的解决方案即可。
答案 0 :(得分:2)
是的,是的,您的算法进行了3N
个比较,并且复杂度为O(N)
。
这比完全冒泡排序更好,因为算法仅执行部分排序,其余部分仍未排序。
但是请注意,对于固定个最大元素(此处为3),复杂度是线性的。如果您需要选择n/3
个最大的排序方式-这种方法将变成二次方,而您会选择另一种部分排序方式(例如,基于Quicksort分区的算法或二进制堆之一)