สมมติว่าเรามีอาร์เรย์ A ที่มีองค์ประกอบ n (n เป็นเลขคี่) A มีการเรียงสับเปลี่ยนของจำนวน n ตัวแรก ให้มีฟังก์ชัน f(i) ซึ่งรับอาร์กิวเมนต์เดียว i ในช่วง 0 ถึง n-2 และดำเนินการดังนี้ ถ้า A[i]> A[i+1] ให้สลับค่าของ A[i] และ A[ ผม+1]. เราต้องนับจำนวนการวนซ้ำเพื่อจัดเรียงอาร์เรย์ A เป็นครั้งแรก
ดังนั้น หากอินพุตเป็น A =[4, 5, 7, 1, 3, 2, 6] เอาต์พุตจะเป็น 5 เพราะอาร์เรย์จะระบุหลังจากการวนซ้ำแต่ละครั้งจะเป็นดังนี้:[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].
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
n :=size of Af :=0Ans :=0for initialize Ans :=0, do:f :=0 for initialize j :=0 when jA[j + 1] แล้ว:f :=1 ถ้าไม่ใช่ f ไม่เป็นศูนย์ แล้ว:ออกมาจากลูปเพื่อเริ่มต้น j :=(Ans AND 1) เมื่อ j A[j + 1] จากนั้น:สลับ A[j] และ A[j + 1] (เพิ่ม Ans โดย 1) ส่งคืน Ansก่อน> ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้เนมสเปซ std;int แก้ปัญหา(เวกเตอร์ A){ int n =A.size(); บูล f =0; คำตอบ int =0; สำหรับ (คำตอบ =0;;){ f =0; สำหรับ (int j =0; j A[j + 1]) f =1; ถ้า (!f) แตก; สำหรับ (int j =(Ans &1); j A[j + 1]) swap(A[j], A[j + 1]); ตอบ++; } return Ans;}int main(){ vector A ={ 4, 5, 7, 1, 3, 2, 6 }; ศาล <<แก้ (A) < อินพุต
{ 4, 5, 7, 1, 3, 2, 6 }ผลลัพธ์
5