我需要编写一个算法来获取一个int数组并找到数组中第k个最大的元素。需要注意的是运行时必须是O(K * n)或更好。
我的老师明确表示这可以通过修改后的冒泡程序来完成,但我不确定如何在不破坏它的情况下修改冒泡排序,因为我认为有必要循环遍历每个元素。阵列。这是我的代码(只是程序的shell和未修改的冒泡排序):
public int kthLargest(int[] A, int k){
int[] sorted = A;
int temp;
for (int i = (A.length - 1); i >= 0; i--)
{
for (int j = 1; j <= i; j++)
{
if (sorted[j-1] < sorted[j])
{
temp = sorted[j-1];
sorted[j-1] = sorted[j];
sorted[j] = temp;
}
}
}
return sorted[k-1];
}
想出来:
public int kthLargest(int[] A, int k){
int[] sorted = A;
int temp;
for (int i = 0; i < A.length-1; i++)
{
for (int j = 0; j < A.length-i-1; j++)
{
if (sorted[j] > sorted[j+1])
{
temp = sorted[j];
sorted[j] = sorted[j+1];
sorted[j+1] = temp;
}
if(i == (k-1)) return A[A.length-i-1];
}
}
return sorted[A.length-k];
}
数组已经被排序到第k个最大的元素,它已经找到它正在寻找的东西并且可以停止排序并返回。
答案 0 :(得分:0)
如果列表已经排序,我认为修改后的冒泡排序会提前退出吗?
这样的东西不会这样吗?
public int kthLargest(int[] A, int k){
int[] sorted = A;
int temp;
bool bSorted = TRUE;
for (int i = (A.length - 1); i >= 0; i--)
{
for (int j = 1; j <= i; j++)
{
if (sorted[j-1] < sorted[j])
{
temp = sorted[j-1];
sorted[j-1] = sorted[j];
sorted[j] = temp;
bSorted = FALSE;
}
}
if(bSorted)
break;
}
return sorted[k-1];
}