Giả sử chúng ta có một mảng A với n phần tử (n là số lẻ). A chứa một hoán vị của các số tự nhiên đầu tiên. Giả sử có một hàm f (i) điều này nhận một đối số i trong phạm vi 0 đến n-2 và thực hiện phép toán:nếu A [i]> A [i + 1], hãy hoán đổi các giá trị của A [i] và A [ i + 1]. Chúng ta phải đếm số lần lặp để sắp xếp mảng A, lần đầu tiên.
Vì vậy, nếu đầu vào là A =[4, 5, 7, 1, 3, 2, 6], thì đầu ra sẽ là 5, bởi vì mảng trạng thái sau mỗi lần lặp là:[4, 5, 1, 7, 2, 3, 6], [4, 1, 5, 2, 7, 3, 6], [1, 4, 2, 5, 3, 7, 6], [1, 2, 4, 3, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7].
Các bước
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
n:=size of Af:=0Ans:=0 để khởi tạo Ans:=0, do:f:=0 để khởi tạo j:=0, khi jA [j + 1], thì:f:=1 nếu không f khác 0, thì:Ra khỏi vòng lặp để khởi tạo j:=(Ans AND 1), khi j A [j + 1], sau đó:hoán đổi A [j] và A [j + 1] (tăng Ans lên 1) trả về Ans Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#includeusing namespace std; int Giải (vector A) {int n =A.size (); bool f =0; int Ans =0; for (Ans =0;;) {f =0; for (int j =0; j A [j + 1]) f =1; if (! f) break; for (int j =(Ans &1); j A [j + 1]) swap (A [j], A [j + 1]); Ans ++; } return Ans;} int main () {vector A ={4, 5, 7, 1, 3, 2, 6}; cout < Đầu vào
{4, 5, 7, 1, 3, 2, 6}Đầu ra
5