Các báo cáo vấn đề thiếu chức năng so sánh, vì vậy tôi sẽ xác định so sánh (Lista, listb) để so sánh nút đầu tiên của Lista với nút đầu tiên của listb và trở về -1 cho <, 0 cho =, 1 cho lớn hơn, hoặc tất cả những gì thực sự cần thiết cho sắp xếp hợp nhất là 0 cho < = và 1 cho>.
Ngoài ra còn thiếu là giá trị trả về để biểu thị danh sách trống khi thực hiện pa hoặc pb. Tôi sẽ định nghĩa pa hoặc pb để trả về 1 nếu danh sách nguồn không rỗng và 0 nếu danh sách nguồn trống (không có nút nào để sao chép).
Không rõ liệu mục tiêu là số lượng lệnh nhỏ nhất có đề cập đến số lượng hướng dẫn trong mã nguồn hoặc số lượng lệnh được thực hiện trong quá trình sắp xếp hay không.
-
Số lệnh nhỏ nhất trong mã sẽ xoay danh sách2 dựa trên so sánh với danh sách1 để chèn các nút vào danh sách2 ở vị trí thích hợp. Bắt đầu với một pb, và thiết lập kích thước list2 là 1. Sau đó rb hoặc rrb được thực hiện để xoay list2 đến nơi mà pb tiếp theo nên được thực hiện. Mã sẽ theo dõi danh sách2 "bù đắp" đến nút nhỏ nhất để tránh vòng lặp vô tận trong danh sách xoay2. Độ phức tạp là O (n^2).
-
Tôi nghĩ rằng sắp xếp nhanh nhất và có lẽ ít nhất số lượng lệnh được thực hiện là sắp xếp hợp nhất từ dưới lên.
Thực hiện sắp xếp hợp nhất từ dưới lên trong khi xoay danh sách, sử dụng chúng như bộ đệm/danh sách vòng tròn. Sao chép list1 vào list2 để tạo ra một số các nút, sử dụng chuỗi | count = 0 | trong khi (pb) {rb | đếm + = 1}.
Sử dụng số, di chuyển mọi nút khác từ list2 đến list1 bằng {pa, rr}, n/2 lần. Luôn theo dõi số lượng nút thực tế trên mỗi danh sách để biết khi nào kết thúc hợp lý của một danh sách. Cũng theo dõi một bộ đếm chạy cho mỗi danh sách để biết khi nào kết thúc hợp lý của một lần chạy. Tại thời điểm này, bạn có hai danh sách trong đó các nút đồng đều nằm trong danh sách1 và các nút lẻ nằm trong danh sách2.
Kích thước chạy bắt đầu lúc 1 và tăng gấp đôi trên mỗi lượt vượt qua. Đối với lần đầu tiên vượt qua với kích thước chạy của 1, kết hợp các nút ngay cả với các nút lẻ, tạo các lần chạy được sắp xếp có kích thước 2, xen kẽ thêm các cặp được sắp xếp của các nút vào list1 và list2. Ví dụ, nếu phụ thêm vào list1, và nút list1 < = nút list2, sử dụng {ra, run1count - = 1}, sử dụng {pa, ra, run2count - = 1}. Khi kết thúc một lần chạy, chạm phần còn lại của lần chạy còn lại vào cuối danh sách. Trong lần vượt qua tiếp theo, hợp nhất các lần chạy được sắp xếp của 2 nút từ danh sách, luân phiên nối các chuỗi được sắp xếp gồm 4 nút cho mỗi danh sách. Tiếp tục điều này cho các lần chạy 8, 16, ... cho đến khi tất cả các nút kết thúc trên một danh sách.
Vì vậy, đó là một đèo để đếm các nút, một đường chuyền để chia nhỏ các nút lẻ và lẻ, và ceil (log2 (n)) chuyển để thực hiện sắp xếp hợp nhất. Chi phí cho các hoạt động danh sách liên kết là nhỏ (xoay loại bỏ và nối thêm một nút), do đó, việc hợp nhất tổng thể nên được khá nhanh chóng.
Số lượng hướng dẫn trên đèo đếm có thể giảm xuống trong khi (pb) {count + = 1}, sẽ sao chép danh sách1 thành danh sách2 được đảo ngược. Sau đó nhổ list2 vào list1 cũng sẽ được thực hiện bằng cách sử dụng rrr để unreverse chúng.
Độ phức tạp là O (n log (n)).
Bạn có thể thực hiện sắp xếp hợp nhất khá hiệu quả với các thao tác này. –
Vì vậy, tôi nên đặt một nửa danh sách 1 trong danh sách 2, sau đó sắp xếp cả hai danh sách cùng một lúc và hợp nhất chúng? – Henry
Tôi nghĩ rằng một số loại sắp xếp nhanh hoặc sắp xếp hợp nhất sẽ là cách để đi.Lưu trữ các nút mà không được sử dụng sẽ là một chút khôn lanh mặc dù. –