Cuando k no es muy grande, puede atravesar directamente la matriz y guardar datos con variables temporales
Ejemplo: Encuentre la solución O (n) del segundo número más grande en una matriz
#include <iostream>
using namespace std;
int two_rank(int* arr, int len){
int min = 0;
int two_min = 0;
if(len < 2)return -1;
for(int i = 0; i < len; i++){
if(i == 0){
min = arr[0];
}else if(i == 1){
if(arr[1] < min){
two_min = min;
min = arr[1];
}else{
two_min = arr[1];
}
}else{
if(arr[i] < min){
two_min = min;
min = arr[i];
}else if(arr[i] >= min && arr[i] < two_min){
two_min = arr[i];
}else{
continue;
}
}
}
return two_min;
}
int main(){
int arr[] = {123, 241, 222, 12, 567, 222, 12234, 22};
int len = sizeof(arr)/sizeof(arr[0]);
int ret = two_rank(arr, len);
cout << ret << '\n';
return 0;
}
Cuando k no está seguro, use el código de partición de movimiento rápido optimizado
#include <iostream>
using namespace std;
void mid_three(int* arr, int left, int right){
int mid = left + ((right-left) >> 1);
if(arr[left] > arr[right]){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
if(arr[left] > arr[mid]){
int temp = arr[left];
arr[left] = arr[mid];
arr[mid] = temp;
}
if(arr[mid] > arr[right]){
int temp = arr[mid];
arr[mid] = arr[right];
arr[right] = temp;
}
int temp = arr[left];
arr[left] = arr[mid];
arr[mid] = temp;
}
int partition(int* arr, int left, int right){
mid_three(arr, left, right);
int temp = arr[left];
while(left < right){
while(arr[right] >= temp && left < right){
right--;
}
arr[left] = arr[right];
while(arr[left] <= temp && left < right){
left++;
}
arr[right] = arr[left];
}
arr[left] = temp;
return left;
}
int k_rank(int* arr, int left, int right, int k){
while(left < right){
int pivod = partition(arr, left, right);
if(pivod < k - 1){
left = pivod + 1;
}else if(pivod = k - 1){
return arr[pivod];
}else{
right = pivod - 1;
}
}
}
int main(){
int arr[] = {123, 241, 222, 12, 567, 222, 12234, 22};
int len = sizeof(arr)/sizeof(arr[0]);
int ret = k_rank(arr, 0, len-1, 4);
cout << ret << '\n';
return 0;
}