Versi yang lebih pendek dari hal yang sama menggunakan fitur ES2017 seperti fungsi panah dan penghancuran:
Fungsi
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)
Ini menerima array input dan membandingkan fungsi:
stableSort([5,6,3,2,1], (a, b) => a - b)
Ini juga mengembalikan array baru daripada membuat semacam di tempat seperti fungsi Array.sort () bawaan .
Uji
Jika kita mengambil input
larik berikut , awalnya diurutkan berdasarkan 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 }
]
Kemudian urutkan dengan height
menggunakan stableSort
:
stableSort(input, (a, b) => a.height - b.height)
Hasil dalam:
// 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 }
]
Namun mengurutkan input
larik yang sama menggunakan Array.sort()
bawaan (di Chrome / NodeJS):
input.sort((a, b) => a.height - b.height)
Pengembalian:
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 }
]
Sumber daya
Memperbarui
Array.prototype.sort
sekarang stabil di V8 v7.0 / Chrome 70!
Sebelumnya, V8 menggunakan QuickSort yang tidak stabil untuk array dengan lebih dari 10 elemen. Sekarang, kami menggunakan algoritma TimSort yang stabil.
sumber