思路:
采用改进快速排序的方式,首先选择一个比较数,通过一个排序,把比比较数大的数放到比较数的左边,比比较数小的数放在比较数的右边,时间是N;如果此时比较数的下标等于n,则比较数是第n大;如果此时比较数的下标大于n,则第n大的数在比较数的左边,我们在左边的集合采用上述方法进行查找,直到比较数的下标等于n;否则我们在右边的集合采用上述方法进行查找,直到比较数的下标等于n;
时间复杂度:T(N) = N + N/2 + N/4 + ......,T(N) 约等于2N。
public Comparable findBiggerN(Comparable[] array, int n) {
findBiggerN(array, 0, array.length-1, n);
return array[n];
}
public void findBiggerN(Comparable[] array, int low, int high, int n) {
if (low >= high) {
return;
}
int j = findBiggerN(array, low, high);
if (j==n) {
return;
} else if (j < n) {
findBiggerN(array, j+1, high, n);
} else {
findBiggerN(array, low, j-1, n);
}
}
public int findBiggerN(Comparable[] array, int low, int high) {
Comparable v = array[low];
int i = low, j = high+1;
while (i < j) {
//从右向左找比v大的交换
while (array[--j].compareTo(v) < 0) {
if (j == low) {
break;
}
}
if (array[j].compareTo(v) > 0) {
Comparable temp = array[i];
array[i] = array[j];
array[j] = temp;
}
if (i==j) {
break;
}
//从左向右找比v大的交换
while (array[++i].compareTo(v) > 0) {
if (i == high) {
break;
}
}
if (array[i].compareTo(v) < 0) {
Comparable temp = array[j];
array[j] = array[i];
array[i] = temp;
}
if (i==j) {
break;
}
}
return j;
}