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