Tôi quan tâm đến việc sắp xếp một mảng các giá trị nguyên dương theo thời gian tuyến tính (trong mô hình RAM với thước đo chi phí đồng nhất, nghĩa là các số nguyên có thể có kích thước logarit nhưng các hoạt động số học trên chúng được giả định đơn vị thời gian). Tất nhiên, điều này là không thể đối với các thuật toán sắp xếp dựa trên so sánh, vì vậy tôi quan tâm đến việc tính toán một loại "gần đúng", nghĩa là tính toán một số hoán vị của không thực sự được sắp xếp nói chung mà là "xấp xỉ tốt" của phiên bản sắp xếp . Tôi sẽ giả định rằng chúng ta đang sắp xếp các số nguyên theo thứ tự giảm dần vì nó làm cho phần tiếp theo trở nên dễ chịu hơn một chút, nhưng tất nhiên người ta có thể diễn đạt vấn đề theo cách khác.
Một tiêu chí có thể có cho một loại sắp xếp gần đúng là (*): đặt là , với mỗi , chúng tôi yêu cầu (nghĩa là, danh sách "sắp xếp gần đúng" được giới hạn từ phía trên bởi hàm giảm ). Dễ dàng thấy rằng sắp xếp thực tế thỏa mãn điều này: phải không lớn hơn vì vậy nó nhiều nhất là và nói chung phải không lớn hơn là.
Chẳng hạn, yêu cầu (*) có thể đạt được bằng thuật toán bên dưới (được đề xuất bởi @Louis). Câu hỏi của tôi là: Có công việc hiện tại về nhiệm vụ "gần như sắp xếp" số nguyên này trong thời gian tuyến tính, bằng cách áp đặt một số yêu cầu như (*) mà sắp xếp thực sự sẽ đáp ứng? Liệu thuật toán dưới đây, hoặc một số biến thể của nó, có một tên được thiết lập?
Chỉnh sửa: sửa lỗi thuật toán và thêm giải thích
Thuật toán:
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
| +
+
Thuật toán này hoạt động như dự định vì những lý do sau:
- Nếu một phần tử nằm trong nhóm thì .
được đặt vào thùng , do đó j ≤ \ lfloor N / v \ rfloor N / v
- Nếu một phần tử nằm trong nhóm thì hoặc .
được đặt vào thùng , do đó hoặc . Trong trường hợp đầu tiên có nghĩa là và do đó .
Đối với , có nhiều nhất là các phần tử trong các xô từ 1 đến .
Đặt và gọi là tổng số phần tử trong một trong các nhóm 1..j. Bằng 2. chúng ta có mọi phần tử trong một thùng (với ) sao cho . Do đó, tổng của tất cả các phần tử trong các thùng từ đến lớn hơn . Nhưng tổng này cũng nhỏ hơn do đó và do đó mang lại cho chúng ta hoặc .v i i ≤ j N / ( j + 1 ) ≤ N / ( i + 1 ) < v K 1 j k × N / ( J + 1 ) K
thỏa mãn (*) tức là phần tử thứ của sao cho
Đến 3. ta có , phần tử thứ của , xuất phát từ một nhóm với do đó .
Thuật toán này mất thời gian tuyến tính.
Việc tính toán mất thời gian tuyến tính. Các thùng có thể được thực hiện với một danh sách liên kết có chèn và lặp . Vòng lặp lồng nhau chạy nhiều lần như có các phần tử (tức là lần).