อัลกอริทึมหนีจากกรณีที่ไม่ดีส่วนใหญ่โดยใช้เดือยที่สุ่มการยกเว้นองค์ประกอบต่อเนื่องเท่ากับ pivot จากการแบ่งพาร์ติชันและการค้นหาแบบไม่สมมาตร มันค้นหาไปข้างหน้าองค์ประกอบที่มากกว่าหรือเท่ากับเดือยและค้นหาย้อนหลังองค์ประกอบน้อยกว่าเดือย
ฉันขอบคุณ MichaelT การคิดค้นการค้นหาแบบไม่สมมาตรเพื่อแก้ไข [2,1,2,1,2,1,2,1]
ผลลัพธ์ต่อไปนี้สร้างโดยฟังก์ชันของฉัน qsort_random () N = 100,000
usec call compare copy pattern
80132 62946 1971278 877143 random
47326 57578 1606067 215155 sorted : 0,1,2,3,...,n-1
49927 63578 1628883 338715 sorted in reverse : n-1,n-2,...,2,1,0
55619 63781 1596934 377330 nearly reverse : n-2,n-1,n-4,n-3,...,2,3,0,1
54714 66667 1611454 290392 median-3-killer : n-1,0,1,2,...,n-2
1491 1 99999 4 all values the same : n,n,n,...
1577 1 99999 4 first is higher : n,1,1,1,...
2778 2 156159 10 last is lower : n,n,n,...,n,1
2994 3 199996 100009 a few data : n,...,n,1,...,1
3196 3 199996 50012 zigzag : n,1,n,1,...,n,1
917796 56284 67721985 673356 valley(sawtooth?) : n-1,n-3,...,0,...,n-4,n-2
กรณีส่วนใหญ่จะเร็วกว่ารูปแบบสุ่ม รูปแบบหุบเขาเป็นกรณีที่ไม่ดีสำหรับการเลือกเดือยส่วนใหญ่
qsort(3) usec = 14523 call = 0 compare = 884463 copy = 0
qsort_head() usec = 138609 call = 99999 compare = 8120991 copy = 1214397
qsort_middle() usec = 664325 call = 99999 compare = 52928111 copy = 1036047
qsort_trad() usec = 118122 call = 99999 compare = 6476025 copy = 1337523
qsort_random() usec = 295699 call = 58806 compare = 19439952 copy = 732962
qsort_log2() usec = 66411 call = 63987 compare = 1597455 copy = 944821
qsort_log2 () หนีออกมาจากตัวพิมพ์เล็กโดยเลือก pivot ในองค์ประกอบ log2 (N)
qsort (3) ใช้ไลบรารี GNU ซึ่งเป็นการเรียงลำดับแบบผสานของการเรียงลำดับดัชนี
qsort_trad () เลือกเดือยในองค์ประกอบแรกกลางและสุดท้าย
qsort_random () และ qsort_log2 () ไม่ใช้การสลับ
แหล่งที่มาของโปรแกรม C และสคริปต์ที่จะโพสต์ในGitHub