โดยพื้นฐานแล้วคุณต้องการทราบว่ามีอัลกอริทึมการเรียงลำดับใดซึ่งจะไม่ลดลงจากค่าเฉลี่ยหากได้รับฟังก์ชั่นการเปรียบเทียบที่คล้ายกับ:
int Compare(object a, object b) { return Random.Next(-1,1); }
... โดยที่ Random.Next () เป็นวิธีการบางอย่างที่จะสร้างจำนวนเต็มที่สร้างแบบสุ่มระหว่างขอบเขตรวมล่างและบนที่ระบุ
คำตอบคือจริง ๆ แล้วว่าอัลกอริธึมการเรียงลำดับพื้นฐานส่วนใหญ่จะดำเนินการตามกรณีเฉลี่ยของพวกเขาเพราะพวกเขาเชื่อฟังอย่างน้อยหนึ่งในสองเงื่อนไขต่อไปนี้:
- การเปรียบเทียบระหว่างสององค์ประกอบที่ไม่ซ้ำกันจะไม่ทำสองครั้งในการเรียงลำดับและ / หรือ
- ในแต่ละการวนซ้ำของการเรียงลำดับตำแหน่งที่ถูกต้องขององค์ประกอบอย่างน้อยหนึ่งจะถูกกำหนดและเพื่อที่จะไม่เปรียบเทียบองค์ประกอบอีกครั้ง
ยกตัวอย่างเช่น SelectionSort ทำซ้ำผ่านรายการย่อยขององค์ประกอบที่ไม่เรียงลำดับค้นหาองค์ประกอบ "น้อยที่สุด" และ / หรือ "ยิ่งใหญ่ที่สุด" (โดยการเปรียบเทียบแต่ละรายการกับช่วงที่ยิ่งใหญ่ที่สุด) วางไว้ในตำแหน่งที่ถูกต้องและทำซ้ำ แม้แต่ในตอนท้ายของการวนซ้ำทุกครั้งอัลกอริธึมจะพบค่าที่คิดว่าน้อยที่สุดหรือยิ่งใหญ่สลับกับองค์ประกอบในตำแหน่งที่มันพยายามกำหนดและไม่เคยพิจารณา องค์ประกอบนั้นอีกครั้งดังนั้นจึงเป็นไปตามเงื่อนไขที่ 2 อย่างไรก็ตาม A และ B สามารถเปรียบเทียบได้หลายครั้งในระหว่างกระบวนการนี้ (เป็นตัวอย่างที่รุนแรงที่สุดให้พิจารณาการเลือกหลายช่วงของ SelectionSort ในอาร์เรย์ที่เรียงลำดับแบบย้อนกลับ) ดังนั้นจึงละเมิดเงื่อนไข 1 .
MergeSort ทำตามเงื่อนไขที่ 1 แต่ไม่ใช่ 2 เมื่ออาร์เรย์ย่อยถูกรวมเข้าด้วยกันองค์ประกอบในอาเรย์ย่อยเดียวกัน (ทางซ้ายหรือขวา) จะไม่ถูกนำมาเปรียบเทียบกันเนื่องจากมันได้ถูกกำหนดแล้วว่าองค์ประกอบด้านอาเรย์นั้นอยู่ในลำดับเดียวกัน อัลกอริทึมจะเปรียบเทียบองค์ประกอบที่ยังไม่ได้รวมน้อยที่สุดของแต่ละ subarray กับอีกอันเพื่อพิจารณาว่าอันไหนที่น้อยกว่าและควรดำเนินการต่อไปในรายการที่ผสาน ซึ่งหมายความว่าวัตถุ A และ B ที่ไม่ซ้ำกันสองรายการใด ๆ จะถูกนำมาเปรียบเทียบกันสูงสุดครั้งเดียว แต่ดัชนี "ขั้นสุดท้าย" ขององค์ประกอบที่กำหนดในคอลเลกชันเต็มไม่เป็นที่รู้จักจนกว่าอัลกอริทึมจะเสร็จสมบูรณ์
InsertionSort ปฏิบัติตามเงื่อนไขที่ 1 เท่านั้นแม้ว่ากลยุทธ์โดยรวมและความซับซ้อนจะมีลักษณะเหมือน SelectionSort แต่ละองค์ประกอบที่ไม่เรียงลำดับจะถูกเปรียบเทียบกับองค์ประกอบที่เรียงลำดับมากที่สุดก่อนจนกระทั่งพบว่ามีองค์ประกอบน้อยกว่าองค์ประกอบภายใต้การตรวจสอบ องค์ประกอบถูกแทรกที่จุดนั้นจากนั้นองค์ประกอบถัดไปจะถูกพิจารณา ผลลัพธ์คือลำดับสัมพัทธ์ของ A และ B ใด ๆ ถูกกำหนดโดยการเปรียบเทียบหนึ่งครั้งและการเปรียบเทียบเพิ่มเติมระหว่าง A และ B นั้นจะไม่ดำเนินการ แต่ตำแหน่งสุดท้ายขององค์ประกอบใด ๆ จะไม่สามารถทราบได้จนกว่าจะมีการพิจารณาองค์ประกอบทั้งหมด
QuickSort เชื่อฟังทั้งสองอย่างเงื่อนไข ในแต่ละระดับ pivot จะถูกเลือกและจัดเรียงเพื่อให้ด้าน "ซ้าย" มีองค์ประกอบน้อยกว่า pivot และด้าน "ขวา" มีองค์ประกอบที่มากกว่า pivot ผลลัพธ์ของระดับนั้นคือ QuickSort (ซ้าย) + pivot + QuickSort (ขวา) ซึ่งโดยทั่วไปหมายถึงตำแหน่งขององค์ประกอบ pivot นั้นเป็นที่รู้จัก (ดัชนีหนึ่งที่มากกว่าความยาวของด้านซ้าย) pivot นั้นไม่เคยถูกเปรียบเทียบกับองค์ประกอบอื่นใด หลังจากที่ได้รับเลือกเป็นเดือย (อาจถูกนำมาเปรียบเทียบกับองค์ประกอบเดือยก่อนหน้า แต่องค์ประกอบเหล่านั้นเป็นที่รู้จักกันและไม่รวมอยู่ใน subarrays ใด ๆ ) และ A และ B ใด ๆ ที่สิ้นสุดในด้านตรงข้ามของเดือยจะไม่เคย เมื่อเทียบกับ ในการใช้งาน QuickSort บริสุทธิ์ส่วนใหญ่เคสพื้นฐานเป็นหนึ่งองค์ประกอบซึ่ง ณ จุดนี้ดัชนีปัจจุบันเป็นดัชนีสุดท้ายและไม่มีการเปรียบเทียบเพิ่มเติม
( 2 / 3 )ยังไม่มีข้อความ- 1) เมื่อค่าสัมบูรณ์สูงสุดของผลลัพธ์ของตัวเปรียบเทียบเพิ่มขึ้นความน่าจะเป็นสำหรับการเปรียบเทียบใด ๆ ที่จะส่งกลับค่าลบหรือศูนย์ลดลงเป็น 0.5 ทำให้มีโอกาสสิ้นสุดอัลกอริทึมที่มีโอกาสน้อยกว่ามาก (โอกาส 99 เหรียญพลิกหัว Landing ทั้งหมด ซึ่งโดยทั่วไปแล้วสิ่งที่สิ่งนี้ทำให้เกิดขึ้นคือ 1 ใน 1.2 * 10 30 )
แก้ไขเวลาที่ยาวนาน:มี "แปลก ๆ " บางอย่างที่ออกแบบมาโดยเฉพาะเพื่อเป็นตัวอย่างของสิ่งที่ไม่ควรทำซึ่งรวมตัวเปรียบเทียบแบบสุ่ม บางทีชื่อเสียงที่สุดคือ BogoSort "กำหนดรายการถ้าไม่มีรายการตามลำดับให้สลับรายการและตรวจสอบอีกครั้ง" ในทางทฤษฎีมันจะในที่สุดก็ตีในการเปลี่ยนแปลงทางด้านขวาของค่าเช่นเดียวกับ "ไม่เหมาะสมการเรียงลำดับแบบฟอง" ข้างต้น แต่กรณีเฉลี่ยอยู่ที่ปัจจัยเวลา (N! / 2) และเนื่องจากปัญหาวันเกิด (หลังจากพีชคณิตแบบสุ่มพอที่คุณ มีแนวโน้มที่จะพบกับการเรียงสับเปลี่ยนที่ซ้ำกันมากกว่าที่ไม่ซ้ำกัน) มีความเป็นไปได้ที่ไม่ใช่ศูนย์ของอัลกอริทึมที่ไม่เคยทำจนจบอย่างเป็นทางการ