ฉันสนใจในการเรียงลำดับอาร์เรย์ของค่าจำนวนเต็มบวกในเวลาเชิงเส้น (ในรูปแบบ RAM ที่มีการวัดต้นทุนสม่ำเสมอคือจำนวนเต็มสามารถมีขนาดได้ถึงลอการิทึม แต่การดำเนินการทางคณิตศาสตร์กับพวกมัน ใช้เวลาหน่วย) แน่นอนว่ามันเป็นไปไม่ได้ด้วยอัลกอริธึมการเรียงลำดับแบบเปรียบเทียบดังนั้นฉันจึงสนใจในการคำนวณการเรียงลำดับ "โดยประมาณ" เช่นการคำนวณการเปลี่ยนแปลงบางอย่างของซึ่งไม่ได้เรียงจริงๆในทั่วไป แต่ "ประมาณการที่ดี" ของรุ่นเรียงLฉันจะสมมติว่าเรากำลังเรียงลำดับจำนวนเต็มในลำดับที่ลดลงเพราะมันจะทำให้ภาคต่อมีความสุขมากขึ้น แต่แน่นอนว่าเราสามารถพูดถึงปัญหาได้อีกทางหนึ่ง
เกณฑ์หนึ่งที่เป็นไปได้สำหรับการเรียงลำดับโดยประมาณดังต่อไปนี้ (*): การให้เป็นสำหรับทุกๆเราต้องการให้ (เช่น "quasi-เรียง "รายการถูกล้อมรอบจากด้านบนโดยฟังก์ชั่นลดลง ) มันง่ายที่จะเห็นว่าการจัดเรียงจริงตรงตามนี้: ต้องไม่มากกว่าดังนั้นมันจึงเป็นอย่างมากซึ่งและโดยทั่วไปจะต้องไม่มากกว่าซึ่งเป็นฉัน
ตัวอย่างเช่นต้องการ (*) สามารถทำได้โดยอัลกอริทึมด้านล่าง (แนะนำโดย @Louis) คำถามของฉันคือ: มีงานในจำนวนเต็ม "เกือบเรียงลำดับ" นี้ในเวลาเชิงเส้นโดยกำหนดความต้องการเช่น (*) ที่เรียงลำดับจริงจะตอบสนอง? อัลกอริทึมด้านล่างหรือบางส่วนของมันมีชื่อที่จัดตั้งขึ้นหรือไม่?
แก้ไข: แก้ไขอัลกอริทึมและเพิ่มคำอธิบายเพิ่มเติม
ขั้นตอนวิธีการ:
INPUT: V an array of size n containing positive integers
OUTPUT: T
N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+
For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+
อัลกอริทึมนี้ใช้งานได้ตามวัตถุประสงค์ด้วยเหตุผลดังต่อไปนี้:
- ถ้าองค์ประกอบอยู่ในถังแล้วญ
จะใส่ลงในถังจึง
- ถ้าองค์ประกอบอยู่ในถังแล้วทั้งหรือ n
จะใส่ลงในถังจึงหรือ n ในครั้งแรกกรณีซึ่งหมายความว่าและทำให้วี
สำหรับมีที่มากที่สุดองค์ประกอบในถังตั้งแต่ 1 ถึงเจ
ให้และให้เป็นจำนวนองค์ประกอบทั้งหมดในหนึ่งในที่เก็บข้อมูล 1..j โดย2.เรามีทุกองค์ประกอบในถัง (กับ ) เป็นเช่นนั้นวี ดังนั้นผลรวมขององค์ประกอบทั้งหมดในถังจากถึงมากกว่า. แต่ผลรวมนี้ก็น้อยกว่าด้วยเช่นกันและ ซึ่งให้เราหรือเจ
พอใจ (*) คือองค์ประกอบ -th ของเป็นเช่นนั้น
โดย3.เรามีที่องค์ประกอบ -th ของมาจากถังกับจึงญ
อัลกอริทึมนี้ใช้เวลาเชิงเส้น
การคำนวณของใช้เวลาเชิงเส้น ถังสามารถนำมาใช้กับรายการที่เชื่อมโยงซึ่งมีการแทรกและการทำซ้ำ การวนซ้ำซ้อนกันทำงานหลายครั้งเท่าที่มีองค์ประกอบ (เช่นครั้ง)