อัลกอริธึมสับเปลี่ยนฟิชเชอร์-เยทส์
อัลกอริทึมนี้คือการสับเปลี่ยนองค์ประกอบในอาร์เรย์ ในการสับเปลี่ยนองค์ประกอบในอาร์เรย์ เราสามารถเขียนตรรกะของเราเองได้ แต่นักพัฒนาหลายคนคิดว่า F อิชเชอร์-เยทส์ อัลกอริทึมการสับเปลี่ยนสมัยใหม่เป็นวิธีที่ดีที่สุดในการสับเปลี่ยนองค์ประกอบในอาร์เรย์ อัลกอริทึมนี้มีขั้นตอนดังต่อไปนี้
ขั้นตอนที่ต้องปฏิบัติตาม
- ตามอัลกอริธึมนี้ เราควรวนรอบอาร์เรย์จากหลังมาข้างหน้า ตัวอย่างเช่น ในตัวอย่างต่อไปนี้ เรามีอาร์เรย์ที่ประกอบด้วย 8 องค์ประกอบ (A,B,C,D,E,F,G,H) จากดัชนี 0 ถึงดัชนี 7 ดังนั้นการวนรอบแรกจะส่งผลต่อองค์ประกอบที่ ดัชนีสุดท้าย 7 นั่นคือ H.
- ขั้นตอนต่อไปคือการสร้างตัวเลขสุ่ม (ดัชนีสุ่ม) ระหว่างดัชนีที่เลือก 7 และดัชนี 0 สำหรับสมมติว่าดัชนีสุ่มเป็น 3
- หลังจากได้รับดัชนีสุ่มสลับองค์ประกอบที่อยู่ในดัชนีที่เลือกและที่ดัชนีสุ่ม องค์ประกอบที่ดัชนีสุ่มในอาร์เรย์ที่ระบุคือ D ดังนั้นหลังจากสลับอาร์เรย์แล้ว อาร์เรย์จะเปลี่ยนเป็น A,B,C ,H,E,G,F,D
- ในการวนรอบที่สองให้ละเว้นดัชนีสุดท้าย (เนื่องจากวนซ้ำแล้ว) และพยายามค้นหาดัชนีสุ่มระหว่างดัชนี 0 และดัชนี 6 ที่อยู่ระหว่างองค์ประกอบ A และ F ปล่อยให้ดัชนีสุ่มที่สร้างขึ้นเป็น 2
- หลังจากได้รับดัชนีสุ่มแล้ว ให้สลับองค์ประกอบที่ดัชนีที่ 6 และ 2 ตอนนี้อาร์เรย์จะมีลักษณะเป็น A,B,F,H,E,G,C,D
- อัลกอริธึมนี้ใช้รูปแบบเดียวกับที่ไม่สนใจดัชนี 6 และเริ่มค้นหาดัชนีสุ่มระหว่างดัชนี 5 และดัชนี 0 เป็นต้น จนกว่าจะถึงดัชนี 1 ไม่สามารถใช้ดัชนี 0 วนซ้ำได้เนื่องจากไม่มีดัชนี น้อยกว่า 0 เพื่อวัตถุประสงค์ในการแลกเปลี่ยน
- โปรดทราบว่ามีความเป็นไปได้ที่จะสร้างดัชนีสุ่มเลือกดัชนีวนรอบ ตัวอย่างเช่น ให้ลูปทำงานระหว่างดัชนี 4 และดัชนี 0 ที่เลือก ปล่อยให้ดัชนีสุ่มสร้างเป็น 4 จากนั้นค่าที่ดัชนี 4 จะยังคงอยู่ที่ตำแหน่งเดิม
ตัวอย่างต่อไปนี้แสดงให้เห็นถึง ฟิชเชอร์-เยทส์ อัลกอริธึมสับเปลี่ยนที่ทันสมัย
ตัวอย่าง
<html> <body> <script> var arr = ['A','B','C','D','E','F','G','H'] var i = arr.length, k , temp; // k is to generate random index and temp is to swap the values while(--i > 0){ k = Math.floor(Math.random() * (i+1)); temp = arr[k]; arr[k] = arr[i]; arr[i] = temp; } document.write(arr); </script> </body> </html>
ผลลัพธ์
C,F,H,D,A,G,E,B // note that output will change for every iteration.