Un primer elemento de la matriz para encontrar cualquiera de la una, utilizando un rápido ordenar la matriz designada puntos, es decir, menos de un elemento en el lado izquierdo del mismo, un mayor que los elementos en el lado derecho del mismo. Luego determine si el elemento a satisface el k-ésimo número más pequeño del sujeto, y emita directamente si cumple, de lo contrario determine qué intervalo dividir a continuación.
Básicamente es lo mismo que el algoritmo de ordenación rápida, excepto que cuando se encuentra el k-ésimo número más pequeño, se sale directamente y la complejidad temporal es O (n)
// Encuentra el késimo número más pequeño # incluye <iostream> usando el espacio de nombres std; int find ( int le, int ri, int a []) // Encuentra la posición del elemento base { int base = a [le]; // Elemento base while (le < ri) { while (le <ri && a [ri]> = base ) // Comience el procesamiento desde el extremo derecho de la secuencia, el mismo ri mayor que la referencia ri-- ; a [le] = a [ri]; // menor que la referencia El intercambio a la izquierda while (le <ri && a [le] <= base ) // Maneja el extremo izquierdo, menos que la base sin cambios le ++ ; a [ri] = a [le]; // Intercambio mayor que la referencia a la derecha } // Cuando los elementos de la izquierda son menores que la base y los elementos de la derecha son mayores que la base, entonces base es el elemento de referencia, le o ri es Posición del elemento de referencia a [le] = base ; return le; } void quick_pow ( int le, int ri, int k, int a []) { if (le> = ri) return ; int pos = find (le, ri , a); if (k- 1 == pos) { cout << a [k- 1] << endl; volver ; } else if (k- 1 < pos) quick_pow (le, pos - 1 , k, a); else quick_pow (pos + 1 , ri, k, a); } int main () { int n, k; cin >> n >> k; int a [ 1000 ]; para ( int i = 0 ; i <n; i ++ ) cin >> a [i]; quick_pow ( 0 , n -1 , k, a); devuelve 0 ; }