Hợp nhất sắp xếp là một thuật toán sắp xếp hoạt động bằng cách chia một nửa danh sách đã cho, sắp xếp đệ quy cả hai danh sách nhỏ hơn và hợp nhất chúng lại với nhau thành một danh sách được sắp xếp. Trường hợp cơ bản của đệ quy đang đến một danh sách đơn, không thể phân tách thêm nhưng theo định nghĩa đã được sắp xếp.
Việc thực hiện thuật toán trong danh sách [1,7,6,3,3,2,5]
có thể được hiển thị theo cách sau:
[1,7,6,3,3,2,5]
/ \ split
[1,7,6,3] [3,2,5]
/ \ / \ split
[1,7] [6,3] [3,2] [5]
/ \ / \ / \ | split
[1] [7] [6] [3] [3] [2] [5]
\ / \ / \ / | merge
[1,7] [3,6] [2,3] [5]
\ / \ / merge
[1,3,6,7] [2,3,5]
\ / merge
[1,2,3,3,5,6,7]
Nhiệm vụ
Viết chương trình hoặc hàm lấy danh sách các số nguyên theo bất kỳ cách hợp lý nào làm đầu vào và trực quan hóa các phân vùng khác nhau của danh sách này trong khi được sắp xếp theo thuật toán sắp xếp hợp nhất. Điều này có nghĩa là bạn không phải xuất một biểu đồ như trên, nhưng chỉ các danh sách là ổn:
[1,7,6,3,3,2,5]
[1,7,6,3][3,2,5]
[1,7][6,3][3,2][5]
[1][7][6][3][3][2][5]
[1,7][3,6][2,3][5]
[1,3,6,7][2,3,5]
[1,2,3,3,5,6,7]
Hơn nữa, bất kỳ ký hiệu danh sách hợp lý nào cũng tốt, do đó, đây cũng sẽ là một đầu ra hợp lệ:
1 7 6 3 3 2 5
1 7 6 3|3 2 5
1 7|6 3|3 2|5
1|7|6|3|3|2|5
1 7|3 6|2 3|5
1 3 6 7|2 3 5
1 2 3 3 5 6 7
Cuối cùng, cách chia một danh sách thành hai danh sách nhỏ hơn tùy thuộc vào độ dài của cả hai danh sách kết quả khác nhau nhiều nhất là một. Điều đó có nghĩa là thay vì chia [3,2,4,3,7]
thành [3,2,4]
và [3,7]
, bạn cũng có thể phân chia bằng cách lấy các phần tử ở các chỉ số chẵn và lẻ ( [3,4,7]
và [2,3]
) hoặc thậm chí ngẫu nhiên phân tách mỗi lần.
Đây là mã golf , vì vậy mã ngắn nhất trong bất kỳ ngôn ngữ nào được đo bằng byte sẽ thắng.
Các trường hợp thử nghiệm
Như đã lưu ý ở trên, định dạng thực tế và cách chia danh sách thành một nửa là tùy thuộc vào bạn.
[10,2]
[10][2]
[2,10]
[4,17,1,32]
[4,17][1,32]
[4][17][1][32]
[4,17][1,32]
[1,4,17,32]
[6,5,4,3,2,1]
[6,5,4][3,2,1]
[6,5][4][3,2][1]
[6][5][4][3][2][1]
[5,6][4][2,3][1] <- Important: This step cannot be [5,6][3,4][1,2], because 3 and 4 are on different branches in the the tree
[4,5,6][1,2,3]
[1,2,3,4,5,6]
[[1,2],[3],[4,5],[6]]
Giai đoạn thực sự là giải pháp chính xác, vì sắp xếp hợp nhất đang hoạt động đệ quy. Đó là nếu chúng ta bắt đầu [1,2,3,4,5,6]
và chia nó thành [1,2,3]
và [4,5,6]
sau đó những danh sách đó được xử lý độc lập cho đến khi chúng được hợp nhất trong bước cuối cùng.
[3]
và [2,1]
, thì chúng nằm trên các nhánh khác nhau, vì vậy chúng ta không thể hợp nhất [3]
và [2]
sau đó [2,1]
được chia thành [2]
và [1]
.