📜  对已排序数组的子数组以相反顺序排列的数组进行排序

📅  最后修改于: 2022-05-13 01:57:51.209000             🧑  作者: Mango

对已排序数组的子数组以相反顺序排列的数组进行排序

给定一个包含 N 个数字的数组,其中子数组按降序排序,数组中的其余数字按升序排序。任务是对一个数组进行排序,其中已排序数组的子数组以相反的顺序排列。

例子:

一种天真的方法是对数组进行排序并打印数组。这种方法的时间复杂度为 O(N log n)。
一种有效的方法是查找并存储反向子数组的起始索引和结束索引。由于子数组按降序排列,其余元素按升序排列,因此只有反转子数组才能对整个数组进行排序。使用两个指针方法反转子数组。

下面是上述方法的实现:

C++
// C++ program to sort an array where
// a subarray of a sorted array
// is in reversed order
#include 
using namespace std;
 
// Function to print the sorted array
// by reversing the subarray
void printSorted(int a[], int n)
{
    int front = -1, back = -1;
 
    // find the starting index of the
    // reversed subarray
    for (int i = 1; i < n; i++) {
        if (a[i] < a[i - 1]) {
            front = i - 1;
            break;
        }
    }
 
    // find the ending index of the
    // reversed subarray
    for (int i = n - 2; i >= 0; i--) {
        if (a[i] > a[i + 1]) {
            back = i + 1;
            break;
        }
    }
 
    // if no reversed subarray is present
    if (front == -1 and back == -1) {
        for (int i = 0; i < n; i++)
            cout << a[i] << " ";
        return;
    }
 
    // swap the reversed subarray
    while (front <= back) {
 
        // swaps the front and back element
        // using c++ STL
        swap(a[front], a[back]);
 
        // move the pointers one step
        // ahead and one step back
        front++;
        back--;
    }
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
}
 
// Driver Code
int main()
{
    int a[] = { 1, 7, 6, 5, 4, 3, 2, 8 };
    int n = sizeof(a) / sizeof(a[0]);
    printSorted(a, n);
    return 0;
}


Java
// Java program to sort an array where
// a subarray of a sorted array
// is in reversed order
import java.io.*;
 
class GFG
{
 
// Function to print the sorted array
// by reversing the subarray
static void printSorted(int a[], int n)
{
    int front = -1, back = -1;
 
    // find the starting index of the
    // reversed subarray
    for (int i = 1; i < n; i++)
    {
        if (a[i] < a[i - 1])
        {
            front = i - 1;
            break;
        }
    }
 
    // find the ending index of the
    // reversed subarray
    for (int i = n - 2; i >= 0; i--)
    {
        if (a[i] > a[i + 1])
        {
            back = i + 1;
            break;
        }
    }
 
    // if no reversed subarray is present
    if (front == -1 && back == -1)
    {
        for (int i = 0; i < n; i++)
            System.out.println(a[i] + " ");
        return;
    }
 
    // swap the reversed subarray
    while (front <= back)
    {
 
        // swaps the front and back element
        // using c++ STL
        int temp = a[front];
        a[front] = a[back];
        a[back] = temp;
 
        // move the pointers one step
        // ahead and one step back
        front++;
        back--;
    }
    for (int i = 0; i < n; i++)
        System.out.print(a[i] + " ");
}
 
// Driver Code
public static void main (String[] args)
{
    int a[] = { 1, 7, 6, 5, 4, 3, 2, 8 };
    int n = a.length;
    printSorted(a, n);;
}
}
 
// This code is contributed by anuj_67..


Python3
# Python 3 program to sort an array where
# a subarray of a sorted array is in
# reversed order
 
# Function to print the sorted array
# by reversing the subarray
def printSorted(a, n):
    front = -1
    back = -1
 
    # find the starting index of the
    # reversed subarray
    for i in range(1, n, 1):
        if (a[i] < a[i - 1]):
            front = i - 1
            break
 
    # find the ending index of the
    # reversed subarray
    i = n - 2
    while(i >= 0):
        if (a[i] > a[i + 1]):
            back = i + 1
            break
        i -= 1
     
    # if no reversed subarray is present
    if (front == -1 and back == -1):
        for i in range(0, n, 1):
            print(a[i], end = " ")
        return
 
    # swap the reversed subarray
    while (front <= back):
         
        # swaps the front and back element
        # using c++ STL
        temp = a[front]
        a[front] = a[back]
        a[back] = temp
 
        # move the pointers one step
        # ahead and one step back
        front += 1
        back -= 1
     
    for i in range(0, n, 1):
        print(a[i], end = " ")
  
# Driver Code
if __name__ == '__main__':
    a = [1, 7, 6, 5, 4, 3, 2, 8]
    n = len(a)
    printSorted(a, n)
 
# This code is contributed by
# Sahil_Shelangia


C#
// C# program to sort an array where
// a subarray of a sorted array
// is in reversed order
using System;
 
class GFG
{
 
// Function to print the sorted array
// by reversing the subarray
static void printSorted(int []a, int n)
{
    int front = -1, back = -1;
 
    // find the starting index of the
    // reversed subarray
    for (int i = 1; i < n; i++)
    {
        if (a[i] < a[i - 1])
        {
            front = i - 1;
            break;
        }
    }
 
    // find the ending index of the
    // reversed subarray
    for (int i = n - 2; i >= 0; i--)
    {
        if (a[i] > a[i + 1])
        {
            back = i + 1;
            break;
        }
    }
 
    // if no reversed subarray is present
    if (front == -1 && back == -1)
    {
        for (int i = 0; i < n; i++)
        {
            Console.Write(a[i] + " ");
        }
        return;
    }
 
    // swap the reversed subarray
    while (front <= back)
    {
 
        // swaps the front and back element
        // using c++ STL
        swap(a, front, back);
 
        // move the pointers one step
        // ahead and one step back
        front++;
        back--;
    }
    for (int i = 0; i < n; i++)
    {
        Console.Write(a[i] + " ");
    }
}
 
static void swap(int[] a, int front,
                          int back)
{
    int c = a[front];
    a[front] = a[back];
    a[back] = c;
}
 
// Driver Code
public static void Main()
{
    int []a = {1, 7, 6, 5, 4, 3, 2, 8};
    int n = a.Length;
    printSorted(a, n);
}
}
 
// This code contributed by 29AjayKumar


PHP
= 0; $i--)
    {
        if ($a[$i] > $a[$i + 1])
        {
            $back = $i + 1;
            break;
        }
    }
 
    // if no reversed subarray is present
    if ($front == -1 && $back == -1)
    {
        for ($i = 0; $i < $n; $i++)
            echo $a[$i] . " ";
        return;
    }
 
    // swap the reversed subarray
    while ($front <= $back)
    {
 
        // swaps the front and back element
        // using c++ STL
        $temp = $a[$front];
        $a[$front] = $a[$back];
        $a[$back] = $temp;
 
        // move the pointers one step
        // ahead and one step back
        $front++;
        $back--;
    }
    for ($i = 0; $i < $n; $i++)
        echo $a[$i] . " ";
}
 
// Driver Code
$a = array(1, 7, 6, 5, 4, 3, 2, 8);
$n = sizeof($a);
printSorted($a, $n);
 
// This code is contributed
// by Akanksha Rai


Javascript


输出:
1 2 3 4 5 6 7 8

时间复杂度: O(n)