java实现输入一个无序数组datal,且数组中无重复元素,查找出第二大元素。要求: 时间复杂度为O(n)。
时间: 2023-05-21 12:03:06 浏览: 166
可以使用快速选择算法来解决这个问题,时间复杂度为O(n)。具体实现如下:
public static int findSecondLargest(int[] datal) {
int n = datal.length;
int left = 0, right = n - 1;
while (left <= right) {
int pivotIndex = partition(datal, left, right);
if (pivotIndex == n - 2) {
return datal[pivotIndex];
} else if (pivotIndex < n - 2) {
left = pivotIndex + 1;
} else {
right = pivotIndex - 1;
}
}
return -1;
}
private static int partition(int[] datal, int left, int right) {
int pivotValue = datal[right];
int pivotIndex = left;
for (int i = left; i < right; i++) {
if (datal[i] > pivotValue) {
swap(datal, i, pivotIndex);
pivotIndex++;
}
}
swap(datal, pivotIndex, right);
return pivotIndex;
}
private static void swap(int[] datal, int i, int j) {
int temp = datal[i];
datal[i] = datal[j];
datal[j] = temp;
}
在这个算法中,我们使用快速选择算法来找到第二大的元素。快速选择算法的基本思想是,选择一个枢轴元素,将数组分为两部分,一部分比枢轴元素大,一部分比枢轴元素小,然后根据枢轴元素所在的位置来决定继续查找左半部分还是右半部分。在这个问题中,我们选择最大的元素作为枢轴元素,然后根据枢轴元素所在的位置来决定继续查找左半部分还是右半部分,直到找到第二大的元素为止。
阅读全文