อีกทางเลือกหนึ่งในการคิดเกี่ยวกับสิ่งนี้คือสิ่งที่ค่าสูงสุดของi
ก่อนที่จะถูกรีเซ็ต สิ่งนี้ตามที่ปรากฏทำให้ตรงไปตรงมามากขึ้นเกี่ยวกับเหตุผลว่าลำดับการเรียงลำดับก่อนหน้าของA
ส่งผลกระทบต่อเวลารันไทม์ของอัลกอริทึมอย่างไร
โดยเฉพาะอย่างยิ่งสังเกตว่าเมื่อi
ตั้งค่าสูงสุดใหม่แล้วเรียกมันว่า N อาร์เรย์[A[0], ..., A[N-1]]
จะเรียงตามลำดับจากน้อยไปมาก
แล้วจะเกิดอะไรขึ้นเมื่อเราเพิ่มองค์ประกอบA[N]
ลงในส่วนผสม
คณิตศาสตร์:
ดีช่วยบอกมันเหมาะกับที่ตำแหน่งp_Nแล้วเราต้องการทำซ้ำห่วง (ซึ่งผมจะแสดง ) เพื่อย้ายไปวาง ,การทำซ้ำที่จะย้ายไปยังสถานที่และโดยทั่วไป:pNNstepsN−1N+(N−1)N−2
stepsN(pN)=N+(N−1)+(N−2)+⋯+(pN+1)=12(N(N+1)−pN(pN+1))
สำหรับอาร์เรย์ที่เรียงลำดับแบบสุ่มรับการแจกแจงแบบสม่ำเสมอบนสำหรับแต่ละด้วย:pN{0,1,…,N}N
E(stepsN(pN))=∑a=1NP(pN=a)stepsN(a)=∑a=1N1N12(N(N+1)−a(a+1))=12(N(N+1)−13(N+1)(N+2))=13(N2−1)=Θ(N2)
ยอดรวมสามารถแสดงได้โดยใช้สูตรของ Faulhaber หรือลิงก์ Wolfram Alpha ที่ด้านล่าง
สำหรับอาร์เรย์ที่เรียงกลับกันสำหรับทั้งหมดและเราได้รับ:pN=0N
stepsN(pN)=12N(N+1)
ว่าการอย่างเคร่งครัดนานกว่าค่าอื่น ๆ ของp_NpN
สำหรับอาร์เรย์ที่เรียงลำดับแล้วและโดยที่คำที่มีลำดับต่ำกว่ามีความสัมพันธ์กันpN=NstepsN(pN)=0
เวลารวม:
ที่จะได้รับเวลาทั้งหมดที่เราสรุปขั้นตอนเหนือทั้งหมดที่ยังไม่มี(ถ้าเราระมัดระวังอย่างยิ่งเราจะสรุปการแลกเปลี่ยนเช่นเดียวกับการวนซ้ำและดูแลเงื่อนไขการเริ่มต้นและสิ้นสุด แต่เป็นเรื่องง่ายที่จะเห็นว่าพวกเขาไม่ได้มีส่วนร่วมในความซับซ้อนในกรณีส่วนใหญ่) .N
และอีกครั้งโดยใช้เส้นตรงของความคาดหวังและสูตรของ Faulhaber:
Expected Total Steps=E(∑N=1nstepsN(pN))=∑N=1nE(stepsN(pN))=Θ(n3)
แน่นอนถ้าด้วยเหตุผลไม่ใช่ (เช่นการกระจายของอาร์เรย์ที่เรากำลังดูอยู่นั้นใกล้จะเรียงแล้ว) สิ่งนี้ไม่จำเป็นเสมอไป เป็นกรณี แต่ต้องใช้การแจกแจงที่เฉพาะเจาะจงอย่างมากในเพื่อให้ได้สิ่งนี้!stepsN(pN)Θ(N2)pN
การอ่านที่เกี่ยวข้อง: