ฉันควรจะเรียงลำดับรายการตัวเลข แต่ฉันขี้เกียจสุด ๆ เป็นเรื่องยากมากที่จะหาวิธีสลับตัวเลขทั้งหมดที่อยู่ในลำดับที่เพิ่มขึ้นดังนั้นฉันจึงใช้อัลกอริทึมของตัวเองที่จะรับประกันว่ารายการใหม่จะถูกจัดเรียง¹ นี่คือวิธีการทำงาน:
สำหรับรายการขนาดNเราจะต้องมีการทำซ้ำN-1 ในแต่ละรอบซ้ำ
ตรวจสอบว่าหมายเลข N'th นั้นเล็กกว่าN + 1'thหรือไม่ หากเป็นเช่นนั้นตัวเลขทั้งสองนี้จะถูกจัดเรียงไว้แล้วและเราสามารถข้ามการทำซ้ำได้
หากไม่ใช่คุณจำเป็นต้องลดจำนวนNหมายเลขแรกอย่างต่อเนื่องจนกว่าตัวเลขทั้งสองนี้จะเป็นไปตามลำดับ
ลองยกตัวอย่างที่เป็นรูปธรรม สมมติว่าอินพุตเป็น
10 5 7 6 1
ในการคำนวณซ้ำครั้งแรกเราจะเปรียบเทียบ 10 และ 5 10 มากกว่า 5 ดังนั้นเราจะลดมันจนกว่ามันจะเล็กกว่า:
4 5 7 6 1
ตอนนี้เราเปรียบเทียบ 5 กับ 7. 5 น้อยกว่า 7 ดังนั้นเราไม่จำเป็นต้องทำอะไรเลยในการทำซ้ำนี้ ดังนั้นเราไปต่อไปและเปรียบเทียบ 7 และ 6 7 มีขนาดใหญ่กว่า 6 ดังนั้นเราจึงลดตัวเลขสามตัวแรกจนกระทั่งมันเล็กกว่า 6 และเราได้สิ่งนี้:
2 3 5 6 1
ตอนนี้เราเปรียบเทียบ 6 และ 1 อีกครั้ง 6 มีขนาดใหญ่กว่า 1 ดังนั้นเราจึงลดตัวเลขสี่ตัวแรกจนกระทั่งมันเล็กกว่า 1 และเราได้สิ่งนี้:
-4 -3 -1 0 1
และเราทำเสร็จแล้ว! ตอนนี้รายการของเราอยู่ในลำดับที่สมบูรณ์แบบ และเพื่อทำให้สิ่งต่าง ๆ ดียิ่งขึ้นเราต้องทำซ้ำผ่านรายการN-1ครั้งดังนั้นอัลกอริทึมนี้จึงเรียงลำดับรายการในเวลาO (N-1)ซึ่งฉันค่อนข้างแน่ใจว่าเป็นอัลกอริทึมที่เร็วที่สุดที่มี²
ความท้าทายของคุณสำหรับวันนี้คือการใช้ Lazy Sort โปรแกรมหรือฟังก์ชั่นของคุณจะได้รับอาร์เรย์จำนวนเต็มในรูปแบบมาตรฐานที่คุณต้องการและคุณจะต้องทำการเรียงลำดับแบบขี้เกียจและส่งกลับรายการ"เรียงลำดับ"ใหม่ อาร์เรย์จะไม่ว่างเปล่าหรือมีจำนวนเต็ม
นี่คือตัวอย่างบางส่วน:
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
และเช่นเคยนี่คือโค้ดกอล์ฟดังนั้นเขียนโปรแกรมที่สั้นที่สุดที่คุณสามารถทำได้!
¹ นี่ไม่ได้หมายความว่ามันหมายถึงอะไร แต่เป็นความจริงทางเทคนิค
² ฉันล้อเล่นได้โปรดอย่าเกลียดฉัน
<sarcasm>
อัลกอริทึมการเรียงลำดับนี้จริง ๆ แล้วยังนาฬิกาในO(N^2)
เวลาที่ซับซ้อนเนื่องจากคุณต้องผ่านรายการที่เข้าถึงก่อนหน้านี้ทั้งหมดในรายการเพื่อลดพวกเขา ฉันแนะนำให้ทำรายการย้อนหลังแทนและลดจำนวนเพียงหนึ่งหมายเลขต่อขั้นตอนเท่าที่จำเป็น สิ่งนี้จะให้ความO(N)
ซับซ้อนที่แท้จริงแก่คุณ! </sarcasm>
O(n^2)
ในแง่ของการเข้าถึงหน่วยความจำ แต่มันไม่ได้O(n)
สำหรับการเปรียบเทียบ?
O(N^2)
คุณยังมีการย้ำผ่านดัชนีก่อนหน้านี้ทั้งหมดในทุกซ้ำดังนั้นจึงยังคงออกมา