📌  相关文章
📜  用于检查数组是否已排序和旋转的 C++ 程序

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

用于检查数组是否已排序和旋转的 C++ 程序

给定一个包含 N 个不同整数的数组。任务是编写一个程序来检查这个数组是否被排序和逆时针旋转。排序后的数组不被认为是排序和旋转的,即应该至少有一个旋转。
例子

Input : arr[] = { 3, 4, 5, 1, 2 }
Output : YES
The above array is sorted and rotated.
Sorted array: {1, 2, 3, 4, 5}. 
Rotating this sorted array clockwise 
by 3 positions, we get: { 3, 4, 5, 1, 2}

Input: arr[] = {7, 9, 11, 12, 5}
Output: YES

Input: arr[] = {1, 2, 3}
Output: NO

Input: arr[] = {3, 4, 6, 1, 2, 5}
Output: NO

方法

  • 找到数组中的最小元素。
  • 现在,如果对数组进行排序,然后旋转最小元素之前的所有元素将按升序排列,并且最小元素之后的所有元素也将按升序排列。
  • 检查最小元素之前的所有元素是否按递增顺序排列。
  • 检查最小元素之后的所有元素是否按升序排列。
  • 检查数组的最后一个元素是否小于起始元素。
  • 如果以上三个条件都满足,则打印YES否则打印NO

下面是上述思想的实现:

C++
// CPP program to check if an array is
// sorted and rotated clockwise
#include 
#include 
  
using namespace std;
  
// Function to check if an array is
// sorted and rotated clockwise
void checkIfSortRotated(int arr[], int n)
{
    int minEle = INT_MAX;
    int maxEle = INT_MIN;
  
    int minIndex = -1;
  
    // Find the minimum element
    // and it's index
    for (int i = 0; i < n; i++) {
        if (arr[i] < minEle) {
            minEle = arr[i];
            minIndex = i;
        }
    }
  
    int flag1 = 1;
  
    // Check if all elements before minIndex
    // are in increasing order
    for (int i = 1; i < minIndex; i++) {
        if (arr[i] < arr[i - 1]) {
            flag1 = 0;
            break;
        }
    }
  
    int flag2 = 1;
  
    // Check if all elements after minIndex
    // are in increasing order
    for (int i = minIndex + 1; i < n; i++) {
        if (arr[i] < arr[i - 1]) {
            flag2 = 0;
            break;
        }
    }
  
    // Check if last element of the array
    // is smaller than the element just
    // starting element of the array
    // for arrays like [3,4,6,1,2,5] - not circular array
    if (flag1 && flag2 && (arr[n - 1] < arr[0]))
        cout << "YES";
    else
        cout << "NO";
}
  
// Driver code
int main()
{
    int arr[] = { 3, 4, 5, 1, 2 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // Function Call
    checkIfSortRotated(arr, n);
    return 0;
}


输出
YES

有关更多详细信息,请参阅有关检查数组是否已排序和旋转的完整文章!