Phiên bản tương tự ngắn hơn một chút sử dụng các tính năng của ES2017 như chức năng mũi tên và cấu trúc hủy:
Chức năng
var stableSort = (arr, compare) => arr
.map((item, index) => ({item, index}))
.sort((a, b) => compare(a.item, b.item) || a.index - b.index)
.map(({item}) => item)
Nó chấp nhận mảng đầu vào và hàm so sánh:
stableSort([5,6,3,2,1], (a, b) => a - b)
Nó cũng trả về mảng mới thay vì sắp xếp tại chỗ như hàm Array.sort () tích hợp sẵn.
Kiểm tra
Nếu chúng ta lấy input
mảng sau , ban đầu được sắp xếp theo weight
:
// sorted by weight
var input = [
{ height: 100, weight: 80 },
{ height: 90, weight: 90 },
{ height: 70, weight: 95 },
{ height: 100, weight: 100 },
{ height: 80, weight: 110 },
{ height: 110, weight: 115 },
{ height: 100, weight: 120 },
{ height: 70, weight: 125 },
{ height: 70, weight: 130 },
{ height: 100, weight: 135 },
{ height: 75, weight: 140 },
{ height: 70, weight: 140 }
]
Sau đó, sắp xếp nó bằng height
cách sử dụng stableSort
:
stableSort(input, (a, b) => a.height - b.height)
Kết quả trong:
// Items with the same height are still sorted by weight
// which means they preserved their relative order.
var stable = [
{ height: 70, weight: 95 },
{ height: 70, weight: 125 },
{ height: 70, weight: 130 },
{ height: 70, weight: 140 },
{ height: 75, weight: 140 },
{ height: 80, weight: 110 },
{ height: 90, weight: 90 },
{ height: 100, weight: 80 },
{ height: 100, weight: 100 },
{ height: 100, weight: 120 },
{ height: 100, weight: 135 },
{ height: 110, weight: 115 }
]
Tuy nhiên, sắp xếp cùng một input
mảng bằng cách sử dụng tích hợp sẵn Array.sort()
(trong Chrome / NodeJS):
input.sort((a, b) => a.height - b.height)
Lợi nhuận:
var unstable = [
{ height: 70, weight: 140 },
{ height: 70, weight: 95 },
{ height: 70, weight: 125 },
{ height: 70, weight: 130 },
{ height: 75, weight: 140 },
{ height: 80, weight: 110 },
{ height: 90, weight: 90 },
{ height: 100, weight: 100 },
{ height: 100, weight: 80 },
{ height: 100, weight: 135 },
{ height: 100, weight: 120 },
{ height: 110, weight: 115 }
]
Tài nguyên
Cập nhật
Array.prototype.sort
hiện đã ổn định trong V8 v7.0 / Chrome 70!
Trước đây, V8 đã sử dụng QuickSort không ổn định cho các mảng có hơn 10 phần tử. Bây giờ, chúng tôi sử dụng thuật toán TimSort ổn định.
nguồn