Computer >> Máy Tính >  >> Lập trình >> C ++

Sắp xếp lại một mảng để arr [i] trở thành arr [arr [i]] với O (1) không gian thừa bằng cách sử dụng C ++

Chúng ta được cung cấp một mảng kiểu số nguyên dương, giả sử, arr [] có kích thước cho trước bất kỳ sao cho các phần tử trong mảng phải có giá trị lớn hơn 0 nhưng nhỏ hơn kích thước của một mảng. Nhiệm vụ là sắp xếp lại mảng theo cách sao cho arr [i] trở thành arr [arr [i]] chỉ trong khoảng trống O (1) đã cho và in ra kết quả cuối cùng.

Hãy để chúng tôi xem các kịch bản đầu ra đầu vào khác nhau cho việc này -

Đầu vào - int arr [] ={0 3 2 1 5 4}

Đầu ra - Mảng trước Sắp xếp:0 3 2 1 5 4 Sắp xếp lại một mảng để arr [i] trở thành arr [arr [i]] với O (1) khoảng trống thừa là:0 1 2 3 4 5

Giải thích - chúng ta được cung cấp một mảng số nguyên có kích thước là 6 và tất cả các phần tử trong mảng có giá trị nhỏ hơn 6. Bây giờ, chúng ta sẽ sắp xếp lại mảng, tức là arr [arr [0] là 0, arr [arr [1]] là 1, arr [arr [2]] là 2, arr [arr [3]] là 3, arr [arr [4]] là 4 và arr [arr [5]] là 5. Vì vậy, mảng cuối cùng sau khi sắp xếp lại là 0 1 2 3 4 5.

Đầu vào - int arr [] ={1, 0}

Đầu ra - Mảng trước khi sắp xếp:1 0 Sắp xếp lại một mảng để arr [i] trở thành arr [arr [i]] với O (1) khoảng trống thừa là:0 1

Giải thích - chúng ta được cung cấp một mảng số nguyên có kích thước là 2 và tất cả các phần tử trong mảng có giá trị nhỏ hơn 2. Bây giờ, chúng ta sẽ sắp xếp lại mảng, tức là arr [arr [0] là 1 và arr [arr [1]] là 0. Vì vậy , mảng cuối cùng sau khi sắp xếp lại là 0 1.

Đầu vào - int arr [] ={1, 0, 2, 3}

Đầu ra - Mảng trước Sắp xếp:1 0 2 3 Sắp xếp lại một mảng để arr [i] trở thành arr [arr [i]] với O (1) khoảng trống thừa là:0 1 2 3

Giải thích - chúng ta được cung cấp một mảng số nguyên có kích thước là 4 và tất cả các phần tử trong mảng có giá trị nhỏ hơn 4. Bây giờ, chúng ta sẽ sắp xếp lại mảng, tức là arr [arr [0] là 0, arr [arr [1]] là 1, arr [arr [2]] là 2 và arr [arr [3]] là 3. Vì vậy, mảng cuối cùng sau khi sắp xếp lại là 0 1 2 3.

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Nhập một mảng các phần tử kiểu số nguyên và tính kích thước của một mảng

  • In mảng trước khi sắp xếp và gọi hàm Sắp xếp lại (arr, size)

  • Bên trong chức năng Sắp xếp lại (arr, size)

    • Bắt đầu vòng lặp FOR từ i đến 0 cho đến khi tôi nhỏ hơn kích thước. Bên trong vòng lặp, đặt nhiệt độ là arr [arr [i]]% size và arr [i] + =temp * size.

    • Bắt đầu vòng lặp FOR từ i đến 0 cho đến khi tôi nhỏ hơn kích thước. Bên trong vòng lặp, đặt arr [i] =arr [i] / size

  • In kết quả.

Ví dụ

#include <bits/stdc++.h>
using namespace std;
void Rearrangement(int arr[], int size){
   for(int i=0; i < size; i++){
      int temp = arr[arr[i]] % size;
      arr[i] += temp * size;
   }
   for(int i = 0; i < size; i++){
      arr[i] = arr[i] / size;
   }
}
int main(){
   //input an array
   int arr[] = {0, 3, 2, 1, 5, 4};
   int size = sizeof(arr) / sizeof(arr[0]);
   //print the original Array
   cout<<"Array before Arrangement: ";
   for (int i = 0; i < size; i++){
      cout << arr[i] << " ";
   }
   //calling the function to rearrange the array
   Rearrangement(arr, size);
   //print the array after rearranging the values
   cout<<"\nRearrangement of an array so that arr[i] becomes arr[arr[i]] with O(1) extra space is: ";
   for(int i = 0; i < size; i++){
      cout<< arr[i] << " ";
   }
   return 0;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra Kết quả sau

Array before Arrangement: 0 3 2 1 5 4
Rearrangement of an array so that arr[i] becomes arr[arr[i]] with O(1) extra space is: 0 1 2 3 4 5