Có thể sử dụng một thuật toán sắp xếp với một so sánh không bắc cầu, và nếu có, tại sao tính chuyển đổi được liệt kê như một yêu cầu để sắp xếp các bộ so sánh?
Lý lịch:
Một thuật toán sắp xếp thường sắp xếp các phần tử của danh sách theo hàm so sánh C (x, y), với
Các yêu cầu cho bộ so sánh này, theo như tôi hiểu chúng:
- phản xạ:
- đối xứng:
- chuyển tiếp:
- C (x, y) được xác định cho tất cả x và y và kết quả chỉ phụ thuộc vào x và y
(Các yêu cầu này luôn được liệt kê khác nhau qua các triển khai khác nhau, vì vậy tôi không chắc là mình đã hiểu đúng chưa)
Bây giờ tôi đang tự hỏi về một hàm so sánh "khoan dung", chấp nhận các số x, y là tương tự nếu : C ( x , y ) = { - 1 nếu x < y - 1 0 nếu | x - y | ≤ 1 + 1 nếu x > y + 1
[ 1, 2, 3, 4, 5]
[1, 4, 3, 2, 5]
[1, 4, 2, 3, 5]
Bộ so sánh dung sai này là phản xạ và không đối xứng, nhưng không phải là bắc cầu.
tức là C (1,2) = 0, c (2,3) = 0, nhưng C (1,3) = -1, vi phạm tính siêu việt
Tuy nhiên, tôi không thể nghĩ ra bất kỳ thuật toán sắp xếp nào sẽ không tạo ra đầu ra "được sắp xếp chính xác" khi đưa ra bộ so sánh này và một danh sách ngẫu nhiên.
Do đó, tính xuyên sáng không được yêu cầu trong trường hợp này? Và có một phiên bản ít nghiêm ngặt hơn về tính siêu việt được yêu cầu để sắp xếp hoạt động không?
Câu hỏi liên quan:
- Tại sao đối xứng là cần thiết để sắp xếp so sánh? (về tính không đối xứng)
- Các thuật toán sắp xếp chấp nhận một bộ so sánh ngẫu nhiên (về một C ngẫu nhiên (x, y))
- OrderBy với một IComparer không chuyển tiếp (về thuật toán sắp xếp c #, theo tôi)