Dada una array con n elementos distintos. Se dice que una array está casi ordenada (no decreciente) si cualquiera de sus elementos puede aparecer a una distancia máxima de 1 de sus lugares originales en la array ordenada. Necesitamos encontrar si la array dada está casi ordenada o no.
Ejemplos:
Input : arr[] = {1, 3, 2, 4} Output : Yes Explanation : All elements are either at original place or at most a unit away. Input : arr[] = {1, 4, 2, 3} Output : No Explanation : 4 is 2 unit away from its original place.
Enfoque de clasificación: con la ayuda de la clasificación, podemos predecir si nuestra array dada está casi ordenada o no. La idea detrás de eso es primero ordenar la array de entrada, digamos A [] y luego, si la array se ordenará casi, cada elemento Ai de la array dada debe ser igual a cualquiera de Bi-1, Bi o Bi + 1 de la array ordenada B [ ].
Complejidad de tiempo: O (nlogn)
// suppose B[] is copy of A[] sort(B, B+n); // check first element if ((A[0]!=B[0]) && (A[0]!=B[1]) ) return 0; // iterate over array for(int i=1; i<n-1; i++) { if (A[i]!=B[i-1]) && (A[i]!=B[i]) && (A[i]!=B[i+1]) ) return false; } // check for last element if ((A[i]!=B[i-1]) && (A[i]!=B[i]) ) return 0; // finally return true return true;
Complejidad de tiempo: O(n Log n)
Enfoque eficiente: La idea se basa en Bubble Sort . Al igual que Bubble Sort, comparamos elementos adyacentes y los intercambiamos si no están en orden. Aquí, después del intercambio, movemos el índice una posición más para que el burbujeo se limite a un lugar. Entonces, después de una iteración, si la array resultante está ordenada, podemos decir que nuestra array de entrada estaba casi ordenada; de lo contrario, no estaba casi ordenada.
// perform bubble sort tech once for (int i=0; i<n-1; i++) if (A[i+1]<A[i]) swap(A[i], A[i+1]); i++; // check whether resultant is sorted or not for (int i=0; i<n-1; i++) if (A[i+1]<A[i]) return false; // If resultant is sorted return true return true;
C++
// CPP program to find whether given array // almost sorted or not #include <bits/stdc++.h> using namespace std; // function for checking almost sort bool almostSort(int A[], int n) { // One by one compare adjacents. for (int i = 0; i < n - 1; i++) { if (A[i] > A[i + 1]) { swap(A[i], A[i + 1]); i++; } } // check whether resultant is sorted or not for (int i = 0; i < n - 1; i++) if (A[i] > A[i + 1]) return false; // is resultant is sorted return true return true; } // driver function int main() { int A[] = { 1, 3, 2, 4, 6, 5 }; int n = sizeof(A) / sizeof(A[0]); if (almostSort(A, n)) cout << "Yes"; else cout << "No"; return 0; }
Java
// JAVA Code to check if given array is almost // sorted or not import java.util.*; class GFG { // function for checking almost sort public static boolean almostSort(int A[], int n) { // One by one compare adjacents. for (int i = 0; i < n - 1; i++) { if (A[i] > A[i + 1]) { int temp = A[i]; A[i] = A[i+1]; A[i+1] = temp; i++; } } // check whether resultant is sorted or not for (int i = 0; i < n - 1; i++) if (A[i] > A[i + 1]) return false; // is resultant is sorted return true return true; } /* Driver program to test above function */ public static void main(String[] args) { int A[] = { 1, 3, 2, 4, 6, 5 }; int n = A.length; if (almostSort(A, n)) System.out.print("Yes"); else System.out.print("No"); } } // This code is contributed by Arnav Kr. Mandal.
Python3
# Python3 program to find whether given # array almost sorted or not # Function for checking almost sort def almostSort(A, n): # One by one compare adjacents. i = 0 while i < n - 1: if A[i] > A[i + 1]: A[i], A[i + 1] = A[i + 1], A[i] i += 1 i += 1 # check whether resultant is sorted or not for i in range(0, n - 1): if A[i] > A[i + 1]: return False # Is resultant is sorted return true return True # Driver Code if __name__ == "__main__": A = [1, 3, 2, 4, 6, 5] n = len(A) if almostSort(A, n): print("Yes") else: print("No") # This code is contributed # by Rituraj Jain
C#
// C# Code to check if given array // is almost sorted or not using System; class GFG { // function for checking almost sort public static bool almostSort(int []A, int n) { // One by one compare adjacents. for (int i = 0; i < n - 1; i++) { if (A[i] > A[i + 1]) { int temp = A[i]; A[i] = A[i + 1]; A[i + 1] = temp; i++; } } // Check whether resultant is // sorted or not for (int i = 0; i < n - 1; i++) if (A[i] > A[i + 1]) return false; // is resultant is sorted return true return true; } // Driver Code public static void Main() { int []A = {1, 3, 2, 4, 6, 5}; int n = A.Length; if (almostSort(A, n)) Console.Write("Yes"); else Console.Write("No"); } } // This code is contributed by Nitin Mittal.
PHP
<?php // PHP program to find // whether given array // almost sorted or not // function for checking // almost sort function almostSort($A, $n) { // One by one compare adjacents. for ($i = 0; $i < $n - 1; $i++) { if ($A[$i] > $A[$i + 1]) { list($A[$i], $A[$i + 1]) = array($A[$i + 1], $A[$i] ); $i++; } } // check whether resultant // is sorted or not for ($i = 0; $i <$n - 1; $i++) if ($A[$i] > $A[$i + 1]) return false; // is resultant is // sorted return true return true; } // Driver Code $A = array (1, 3, 2, 4, 6, 5); $n = sizeof($A) ; if (almostSort($A, $n)) echo "Yes", "\n"; else echo "Yes", "\n"; // This code is contributed by ajit ?>
Javascript
<script> // Javascript Code to check if given array // is almost sorted or not // function for checking almost sort function almostSort(A, n) { // One by one compare adjacents. for (let i = 0; i < n - 1; i++) { if (A[i] > A[i + 1]) { let temp = A[i]; A[i] = A[i + 1]; A[i + 1] = temp; i++; } } // Check whether resultant is // sorted or not for (let i = 0; i < n - 1; i++) if (A[i] > A[i + 1]) return false; // is resultant is sorted return true return true; } let A = [1, 3, 2, 4, 6, 5]; let n = A.length; if (almostSort(A, n)) document.write("Yes"); else document.write("No"); </script>
Producción:
Yes
Complejidad de tiempo : O (N), ya que estamos usando cualquier bucle para atravesar.
Espacio auxiliar: O(1), ya que no estamos utilizando ningún espacio adicional.
Este artículo es una contribución de Shivam Pradhan (anuj_charm) . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA