มิติการสอน
เนื่องจากความเรียบง่ายของวิธีการแบ่งพาร์ติชันของ Lomuto อาจทำให้การนำไปใช้ง่ายขึ้น มีเรื่องเล็ก ๆ น้อย ๆ ที่น่าสนใจในการเขียนโปรแกรม Pearlของ Jon Bentley ในการจัดเรียง:
“ การสนทนาส่วนใหญ่ของ Quicksort ใช้รูปแบบการแบ่งพาร์ติชันตามดัชนีที่กำลังจะมาถึง [... ] [ie Hoare's] แม้ว่าแนวคิดพื้นฐานของรูปแบบนั้นจะตรงไปตรงมา แต่ฉันพบรายละเอียดที่ยุ่งยากเสมอ - ฉันเคยใช้เวลาส่วนที่ดีกว่าในสองวันในการไล่ล่าบั๊กที่ซ่อนอยู่ในลูปการแบ่งพาร์ติชันสั้น ๆ ผู้อ่านร่างเบื้องต้นบ่นว่าวิธีมาตรฐานสองดัชนีนั้นง่ายกว่าของ Lomuto และร่างรหัสบางอย่างเพื่อให้ประเด็นของเขา; ฉันหยุดดูแลฉันพบข้อบกพร่องสองข้อ”
มิติประสิทธิภาพ
สำหรับการใช้งานจริงความสะดวกในการใช้งานอาจต้องเสียสละเพื่อประโยชน์ของประสิทธิภาพ บนพื้นฐานทางทฤษฎีเราสามารถกำหนดจำนวนของการเปรียบเทียบองค์ประกอบและการแลกเปลี่ยนเพื่อเปรียบเทียบประสิทธิภาพ นอกจากนี้เวลาทำงานจริงจะได้รับอิทธิพลจากปัจจัยอื่น ๆ เช่นประสิทธิภาพการแคชและการคาดคะเนความผิดพลาดของสาขา
ที่แสดงด้านล่างขั้นตอนวิธีปฏิบัติตนที่คล้ายกันมากในพีชคณิตแบบสุ่มยกเว้นสำหรับจำนวนของสัญญาแลกเปลี่ยน Lomuto ต้องการสามเท่าโฮฮะ
จำนวนการเปรียบเทียบ
n−1n
จำนวนของการแลกเปลี่ยน
จำนวนของการสลับเป็นแบบสุ่มสำหรับอัลกอริทึมทั้งสองขึ้นอยู่กับองค์ประกอบในอาร์เรย์ หากเราถือว่าการเรียงสับเปลี่ยนแบบสุ่มนั่นคือองค์ประกอบทั้งหมดจะแตกต่างกันและการเรียงสับเปลี่ยนขององค์ประกอบนั้นมีโอกาสเท่ากันเราสามารถวิเคราะห์จำนวนสว็อปที่คาดหวังได้
1,…,n
วิธีการของ Lomuto
jA[j]x1,…,nx−1xx−1x
{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
n
วิธีการของ Hoare
x
ijxij
x
Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
สุดท้ายเราก็เฉลี่ยค่า pivot ทั้งหมดอีกครั้งเพื่อรับจำนวน swaps โดยรวมที่คาดไว้สำหรับการแบ่งพาร์ติชันของ Hoare:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(รายละเอียดเพิ่มเติมสามารถพบได้ในวิทยานิพนธ์ของฉันหน้า 29)
รูปแบบการเข้าถึงหน่วยความจำ
ขั้นตอนวิธีการทั้งสองใช้สองชี้ลงในอาร์เรย์ที่สแกนตามลำดับ ดังนั้นทั้งสองจึงทำงานแคช wrt ที่ดีที่สุด
องค์ประกอบที่เท่าเทียมกันและรายการที่เรียงลำดับแล้ว
ตามที่กล่าวไว้แล้วโดย Wandering Logic ประสิทธิภาพของอัลกอริทึมนั้นแตกต่างกันอย่างมากสำหรับรายการที่ไม่ใช่การเรียงสับเปลี่ยนแบบสุ่ม
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
ข้อสรุป
วิธีการของ Lomuto นั้นง่ายและง่ายต่อการนำไปใช้ แต่ไม่ควรใช้สำหรับการนำวิธีการเรียงลำดับของไลบรารีมาใช้
A[i+1] <= x
ดำเนินการแลกเปลี่ยนพิเศษเมื่อใดก็ตาม ในอาร์เรย์ที่เรียงลำดับ (และได้รับ pivots ที่เลือกอย่างสมเหตุสมผล) Hoare ทำเกือบจะไม่มีการแลกเปลี่ยนและ Lomuto ทำตัน (เมื่อ j มีขนาดเล็กพอแล้วก็มีทั้งหมดA[j] <= x
) ฉันหายไปอะไร?