📜  对仅交换两个元素的几乎排序的数组进行排序

📅  最后修改于: 2021-05-04 15:15:57             🧑  作者: Mango

给定一个几乎排序的数组,其中只有两个元素被交换,如何有效地对数组进行排序?
例子 :

Input:  arr[] = {10, 20, 60, 40, 50, 30}  
// 30 and 60 are swapped
Output: arr[] = {10, 20, 30, 40, 50, 60}

Input:  arr[] = {10, 20, 40, 30, 50, 60}  
// 30 and 40 are swapped
Output: arr[] = {10, 20, 30, 40, 50, 60}

Input:   arr[] = {1, 5, 3}
// 3 and 5 are swapped
Output:  arr[] = {1, 3, 5}

预期的时间复杂度为O(n),并且只有一个交换操作才能修复阵列。

这个想法是从最右边开始遍历并找到第一个乱序元素(小于前一个元素的元素)。找到第一个元素后,通过向左遍历数组,找到另一个order元素。
以下是上述想法的实现。

C++
// C++ program to sort using one swap
#include
#include
using namespace std;
 
// This function sorts an array that can be sorted
// by single swap
void sortByOneSwap(int arr[], int n)
{
    // Traverse the given array from rightmost side
    for (int i = n-1; i > 0; i--)
    {
        // Check if arr[i] is not in order
        if (arr[i] < arr[i-1])
        {
            // Find the other element to be
            // swapped with arr[i]
            int j = i-1;
            while (j>=0 && arr[i] < arr[j])
                j--;
 
            // Swap the pair
            swap(arr[i], arr[j+1]);
            break;
        }
    }
}
 
// A utility function to print an array of size n
void printArray(int arr[], int n)
{
    int i;
    for (i=0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;
}
 
/* Driver program to test insertion sort */
int main()
{
    int arr[] = {10, 30, 20, 40, 50, 60, 70};
    int n = sizeof(arr)/sizeof(arr[0]);
 
    cout << "Given array is \n";
    printArray(arr, n);
 
    sortByOneSwap(arr, n);
 
    cout << "Sorted array is \n";
    printArray(arr, n);
 
    return 0;
}


Java
// Java program to
// sort using one swap
import java.io.*;
 
class GFG
{
// This function sorts an array
// that can be sorted by single swap
static void sortByOneSwap(int arr[],
                          int n)
{
    // Traverse the given array
    // from rightmost side
    for (int i = n - 1; i > 0; i--)
    {
        // Check if arr[i]
        // is not in order
        if (arr[i] < arr[i - 1])
        {
            // Find the other element
            // to be swapped with arr[i]
            int j = i - 1;
            while (j >= 0 && arr[i] < arr[j])
                j--;
 
            // Swap the pair
            int temp = arr[i];
            arr[i] = arr[j + 1];
            arr[j + 1] = temp;
     
            break;
        }
    }
}
 
// A utility function to
// print an array of size n
static void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        System.out.print(arr[i] + " ");
    System.out.println();
}
 
// Driver Code
public static void main(String[] args)
{
int arr[] = {10, 30, 20,
             40, 50, 60, 70};
int n = arr.length;
 
System.out.println("Given array is ");
printArray(arr, n);
 
sortByOneSwap(arr, n);
 
System.out.println("Sorted array is ");
printArray(arr, n);
}
}
 
// This code is contributed by anuj_67.


C#
// C# program to sort using one swap
using System;
 
class GFG
{
 
// This function sorts an array
// that can be sorted by single swap
static void sortByOneSwap(int []arr,
                          int n)
{
    // Traverse the given array
    // from rightmost side
    for (int i = n - 1; i > 0; i--)
    {
        // Check if arr[i] is not in order
        if (arr[i] < arr[i - 1])
        {
            // Find the other element to be
            // swapped with arr[i]
            int j = i - 1;
            while (j >= 0 && arr[i] < arr[j])
                j--;
 
            // Swap the pair
            int temp = arr[i];
            arr[i] = arr[j + 1];
            arr[j + 1] = temp;
 
            break;
        }
    }
}
 
// A utility function to print an
// array of size n
static void printArray(int []arr, int n)
{
    int i;
    for (i = 0; i < n; i++)
        Console.Write(arr[i] + " ");
    Console.WriteLine();
}
 
// Driver Code
public static void Main()
{
    int []arr = {10, 30, 20,
                 40, 50, 60, 70};
    int n = arr.Length;
 
    Console.WriteLine("Given array is ");
    printArray(arr, n);
 
    sortByOneSwap(arr, n);
 
    Console.WriteLine("Sorted array is ");
    printArray(arr, n);
}
}
 
// This code is contributed by 29AjayKumar


PHP
 0; $i--)
    {
        // Check if arr[i]
        // is not in order
        if ($arr[$i] < $arr[$i - 1])
        {
            // Find the other element
            // to be swapped with arr[i]
            $j = $i - 1;
            while ($j >= 0 && $arr[$i] < $arr[$j])
                $j--;
 
            // Swap the pair
            $temp = $arr[$i];
            $arr[$i] = $arr[$j + 1];
            $arr[$j + 1] = $temp;
     
            break;
        }
    }
}
 
// A utility function to
// print an array of size n
function printArray(&$arr, $n)
{
    for ($i = 0; $i < $n; $i++)
        echo $arr[$i] . " ";
    echo "\n";
}
 
// Driver Code
$arr = array(10, 30, 20,
        40, 50, 60, 70);
$n = sizeof($arr);
 
echo "Given array is " . "\n";
printArray($arr, $n);
 
sortByOneSwap($arr, $n);
 
echo "Sorted array is ". "\n";
printArray($arr, $n);
 
// This code is contributed by Akanksha Rai


Javascript


输出 :

Given array is
10 30 20 40 50 60 70
Sorted array is
10 20 30 40 50 60 70