อัลกอริธึมการเรียงลำดับพื้นที่คงที่ที่มีประสิทธิภาพที่สุดคืออะไร?


19

ฉันกำลังมองหาอัลกอริธึมการเรียงลำดับสำหรับ int arrays ที่ไม่ได้จัดสรรไบต์ใด ๆ นอกจากขนาดของอาเรย์และ จำกัด เพียงสองคำสั่ง:

  1. SWAP: สลับดัชนีถัดไปกับดัชนีปัจจุบัน

  2. ย้าย: เลื่อนเคอร์เซอร์ไปที่ดัชนี +1 หรือ -1;

นั่นคือคุณไม่สามารถสลับดัชนีเพื่อนบ้านไม่ใช่หรือสลับดัชนีหลังจากที่คุณเพียงแค่สลับดัชนี100 10อัลกอริธึมที่มีประสิทธิภาพมากที่สุดคืออะไรคือขั้นตอนที่ใช้การเคลื่อนไหวน้อยลง


13
ไม่แปลกที่มันเป็นเครื่องทางกายภาพซึ่งจะเรียงลำดับรายการรถเข็นที่ติดอยู่กับเทป looong ที่ม้วนขึ้น เครื่องสามารถเลื่อนเทปไปข้างหน้าหรือข้างหลังเท่านั้นและสามารถสลับการ์ดที่อยู่ใกล้เคียงเท่านั้น ในโลกแห่งความจริงคุณไม่สามารถเคลื่อนย้ายไปมาได้ดังนั้นสิ่งเหล่านี้จึงเป็นข้อ จำกัด ...
MaiaVictor

2
ดังนั้นเมื่อคุณบอกว่าคุณต้องการอัลกอริทึมที่ไม่ได้จัดสรรไบต์ใด ๆ นอกจากขนาดของอาร์เรย์ฉันคิดว่าคุณอ้างถึงที่เก็บข้อมูลองค์ประกอบใช่ไหม ฉันยังสามารถจัดสรรตัวนับและอะไรเช่นนั้น?
Darkhogg

5
อ๋อแน่นอน แน่นอน. คุณสามารถจัดสรรโครงสร้างเพิ่มเติมได้ คุณยังสามารถจัดสรรอาเรย์ทั้งหมดและทำการคำนวณที่หนักมากและนับเป็นค่าใช้จ่าย 0 สิ่งเดียวที่คุณต้องลดให้น้อยที่สุดคือจำนวน SWAP / MOVEs ของเครื่องจริงเนื่องจากมันช้า การเรียงลำดับฟองเป็นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้
MaiaVictor

1
ฉันไม่คิดว่ามีอัลกอริทึมดังกล่าว โดยไม่ต้องใด ๆหน่วยความจำเสริมคุณจะมีวิธีการเก็บสถานะการควบคุมใด ๆ
Raphael

1
@svrm: ใช่แล้วด้วย RAM ไม่ จำกัด และความสามารถในการคัดลอกเทปลงใน RAM และทำการคำนวณโดยพลการมันฟรีอัลกอริทึม "ลองทุกอย่างและใช้ดีที่สุด" นั้นดีที่สุดในแง่ของจำนวนการเคลื่อนไหวของเทป ไม่น่าจะใช้งานได้จริง แต่นั่นเป็นเพราะในทางปฏิบัติรันไทม์จะเป็น squillions ของปีไม่ใช่ 0 ;-) หากค่าใช้จ่าย N ย้ายเพื่อคัดลอกเทปความยาว N ลงใน RAM แล้วแรงเดรัจฉานไร้เดียงสาอาจไม่เหมาะสม แต่ภายใน N ของที่ดีที่สุด แต่สิ่งนี้ไม่เฉพาะเจาะจงกับปัญหาของคุณ: ปัญหามากมายเมื่อระบุวิธีนี้สามารถแก้ไขได้ "ออฟไลน์" โดยใช้อัลกอริทึมปลอม
Steve Jessop

คำตอบ:



4

จำนวนสลับขององค์ประกอบที่อยู่ติดกันที่จำเป็นในการสั่งซื้ออาร์เรย์เท่ากับจำนวนผู้รุกรานในอาร์เรย์ ด้วยnองค์ประกอบในทั้งหมดมีที่มากที่สุดn * (n-1) / 2 inversions ดังนั้นฟองเรียงลำดับให้จำนวน asymptotically ดีที่สุดของสัญญาแลกเปลี่ยนในรูปแบบนี้


ที่จริงแล้วการเรียงฟองจะให้จำนวนการแลกเปลี่ยนที่ดีที่สุด อย่างไรก็ตามสำหรับการเปลี่ยนแปลงแต่ละครั้งมีหลายวิธีในการทำจำนวน swaps ที่ดีที่สุดและไม่ชัดเจนว่าจะลดจำนวนการเคลื่อนไหวทั้งหมดได้อย่างไร (โดยการเรียงลำดับฟองฉันหมายถึง "เลือกที่ใหญ่ที่สุดไม่เรียงและย้ายไปยังจุดสิ้นสุดของการเรียงลำดับ")
Peter Kravchuk

4

O(n2)

-+

อัลกอริทึมที่ไม่ได้ใช้แฟล็กบูลีนเพื่อทราบว่าเราได้สลับองค์ประกอบใด ๆ หรือไม่ได้รับด้านล่าง (เคล็ดลับในการเก็บข้อมูลในสถานะของเครื่องแทนที่จะเป็นหน่วยความจำ):

Start:
    Do until we are not at the leftmost position (Op 4)
        move left (Op 2b)

Check:
    If we are at rightmost position (Op 3)
        goto Finished:
    If current value is larger than next value (Op 5)
        goto Unfinished:
    move right (Op 2a)
    Repeat Check:

Unfinished:
    If we are at rightmost position (Op 3)
        goto Start:
    If current value is larger than next value (Op 5)
        swap the elements (Op 1) and move right (Op 2a)
    Repeat Unfinished:

Finished:
    The list is sorted now, output it.

วิธีการแก้ปัญหาของ Eric Lippert การเรียงคำพังเพยก็ใช้ได้เช่นกันเพราะโดยทั่วไปมันเป็นวิธีเรียงฟองสองทาง


สิ่งที่เกี่ยวกับการเรียงลำดับการแทรก?
Darkhogg

การเรียงลำดับฟองต้องการอย่างน้อยสองวงวนที่มากกว่าที่อนุญาตแล้ว
Raphael

1
ไม่คุณสามารถไปทางซ้ายและขวาจากนั้นไปทางซ้ายจนกระทั่งไม่มีการเปลี่ยนแปลง (ซึ่งเป็นจำนวนสูงสุด n ครั้ง) โดยไม่ใช้ตัวนับ คุณไม่จำเป็นต้องมีพื้นที่เพิ่มเติมสำหรับการทำเครื่องหมายบูลีนเพื่อสังเกตว่ามีการเปลี่ยนแปลงหรือไม่ หากมีการเปลี่ยนแปลงคุณเพียงข้ามไปที่รูทีนย่อยอื่นซึ่งทำเช่นเดียวกันยกเว้นว่าเป็นรูทีนย่อยอื่น
Shreesh

1
และแน่นอนฉันคิดว่าคุณสามารถอ่านว่างที่ปลายทั้งสองเพื่อให้คุณอาจรู้ว่ามันเป็นจุดเริ่มต้นหรือจุดสิ้นสุดของรายการ นอกจากนี้ฉันคิดว่าเราอ่านทั้งองค์ประกอบปัจจุบันและองค์ประกอบถัดไปเพื่อทราบว่าเราจำเป็นต้องสลับหรือไม่
Shreesh

1
หรือถ้าเราปรับเปลี่ยนผู้ประกอบการแลกเปลี่ยนเป็น "สลับถ้าไม่ได้อยู่ในลำดับ"
Shreesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.