อัลกอริทึมการจัดเรียงและการรวมกันมีการใช้กันอย่างแพร่หลายและจำเป็นต้องเชี่ยวชาญ เพื่อลดเกณฑ์บทความนี้ส่วนใหญ่มุ่งเน้นไปที่ตรรกะและความเรียบง่ายของอัลกอริทึม แต่ไม่ได้ให้ความสนใจกับประสิทธิภาพของอัลกอริทึม การรวมการใช้งานในหนังสือออนไลน์และความต้องการของตนเองมีสี่เป้าหมายที่นี่:
1. การจัดเรียงทั้งหมดขององค์ประกอบทั้งหมด: การจัดเรียงเต็มของ AB คือ AB, BA (เกี่ยวข้องกับคำสั่งซื้อ);
2. การรวมกันขององค์ประกอบทั้งหมด: การรวมกันของ AB ทั้งหมดคือ A, B, AB (คำสั่งไม่เกี่ยวข้อง);
3. ค้นหาว่าการผสมผสานขององค์ประกอบ M คืออะไรในองค์ประกอบ N: การรวมกันของ 2 องค์ประกอบใน ABC คือ AB, AC, BC;
4. ค้นหาสิ่งที่การเตรียมการสำหรับการเลือกองค์ประกอบ M ระหว่างองค์ประกอบ n: การเตรียมการสำหรับการเลือก 2 องค์ประกอบใน ABC คือ AB, BA, AC, CA, BC, CB;
จะพบได้ว่าหลังจากค้นหาการจัดเรียงขององค์ประกอบ M ระหว่างองค์ประกอบ N เราจะจัดชุดขององค์ประกอบ (อาร์เรย์) ที่ประกอบด้วยชุดค่าผสมแต่ละชุดหลังจากค้นหาวิธีการรวมกันของการเลือกองค์ประกอบ M ระหว่างองค์ประกอบ N ดังนั้นจึงเป็นฟังก์ชันการประกอบและตัวอย่างไม่ได้อยู่ในรายการ สำหรับอีกสามเป้าหมายดูรหัส:
การเปลี่ยนแปลงระดับสุดท้ายของชั้นเรียนสาธารณะ { / ** การรวมกันขององค์ประกอบอาร์เรย์เต็มรูปแบบ* / การรวมกันของโมฆะแบบคงที่ (char [] chars) {char [] subchars = char ใหม่ [chars.length]; // อาร์เรย์ที่จัดเก็บข้อมูลย่อย // ปัญหาของการรวมกันทั้งหมดคือการเลือกองค์ประกอบ 1 องค์ประกอบจากองค์ประกอบทั้งหมด (แสดงเป็น n) บวกกับการรวมกันของ 2 องค์ประกอบ ... บวกผลรวมของการรวมกันขององค์ประกอบ n สำหรับ (int i = 0; i <chars.length; ++ i) {สุดท้าย int m = i +1; การรวมกัน (chars, chars.length, m, subchars, m); }} /*** การใช้งานการรวมกันขององค์ประกอบ n กับองค์ประกอบ n หลักการมีดังนี้: * เลือกจากด้านหลังไปด้านหน้าเลือกตำแหน่ง I แล้วเลือก M-1 ใน I-1 แรก * ตัวอย่างเช่น: 3 องค์ประกอบถูกเลือกจาก 1, 2, 3, 4, 5. * 1) หลังจากเลือก 5 จากนั้นเลือก 2 ใน 4 แรกและเลือก 2 ใน 4 แรกเป็นปัญหาย่อยอื่นเพียงแค่เรียกซ้ำ; * 2) หากคุณไม่รวม 5 เลือก 4 โดยตรงจากนั้นเลือก 2 ใน 3 แรกและเลือก 2 ในสามครั้งแรกเป็นปัญหาย่อยอื่นเพียงแค่เรียกซ้ำ; * 3) หากคุณไม่รวม 4 เลือก 3 โดยตรงจากนั้นเลือก 2 ใน 2 แรกและมีเพียงสองใน 2 แรก * ดูทิศทางแนวตั้ง 1 และ 2 และ 3 เกิดขึ้นเป็นลูปค่าเริ่มต้นคือ 5 และค่าสุดท้ายคือ M * เมื่อมองไปที่ทิศทางแนวนอนปัญหานี้เป็นการเรียกซ้ำของ M-1 ใน I-1 แรก */การรวมกันเป็นโมฆะแบบคงที่ (char [] chars, int n, int m, char [] subchars, int subn) {ถ้า (m == 0) {// ส่งออกสำหรับ (int i = 0; i <subn; ++ i) {system.out.print (subchars [i]); } system.out.println (); } else {สำหรับ (int i = n; i> = m; --i) {// เลือก subchars [m - 1] = chars [i - 1]; // เลือกชุดค่าผสม (chars, i - 1, m - 1, subchars, subn); // เลือก M-1 จาก I-1 ครั้งแรกสำหรับการเรียกซ้ำ}}}}/ ** การเปลี่ยนแปลงอย่างเต็มรูปแบบขององค์ประกอบอาร์เรย์*/ การเปลี่ยนแปลงโมฆะแบบคงที่ (Char [] Chars) {การเปลี่ยนแปลง (Chars, 0, Chars.length-1); } /** subarrays ในอาร์เรย์จากดัชนีเริ่มที่จะสิ้นสุดดัชนีการมีส่วนร่วมในการเปลี่ยนแปลงเต็มรูปแบบ* /การเปลี่ยนแปลงโมฆะแบบคงที่ (char [] chars, int เริ่มต้น, int end) {ถ้า (เริ่มต้น == end) {// ทางออกคือเมื่อตัวละครสุดท้ายเท่านั้น (int i = 0; i <chars.length; } system.out.println (); } else {สำหรับ (int i = เริ่มต้น; i <= end; ++ i) {// ตัวละครแต่ละตัวได้รับการแก้ไขเป็นตัวแรกถ้า (canswap (chars, เริ่มต้น, i)) {// deduplicate swap (chars, เริ่มต้น, i); // สลับการเปลี่ยนแปลง (ตัวอักษรเริ่มต้น + 1, สิ้นสุด); // พบการเปลี่ยนแปลงอย่างเต็มรูปแบบของการแลกเปลี่ยนอาเรย์ย่อย (Chars, เริ่มต้น, i); // คืนค่า}}}}} การแลกเปลี่ยนโมฆะคงที่ (char [] chars, int จาก, int ถึง) {char temp = chars [จาก]; chars [จาก] = chars [ถึง]; chars [ถึง] = temp; } บูลีนแบบคงที่ canswap (char [] chars, int เริ่มต้น, int end) {สำหรับ (int i = เริ่มต้น; i <end; ++ i) {ถ้า (chars [i] == chars [end]) {return false; }} ส่งคืนจริง; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {final char [] chars = char ใหม่ [] {'a', 'b', 'c'}; การเปลี่ยนแปลง (Chars); System.out.println ("============================================================= out.out.println (chars);}}}}}}}}}}}ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น