ES2017 में एरो फंक्शंस और डिस्ट्रक्टुरिंग जैसी सुविधाओं का उपयोग करते हुए एक ही चीज़ का थोड़ा छोटा संस्करण:
समारोह
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)
यह इनपुट ऐरे को स्वीकार करता है और फ़ंक्शन की तुलना करता है:
stableSort([5,6,3,2,1], (a, b) => a - b)
यह बिल्ट-इन Array.sort () फ़ंक्शन की तरह इन-प्लेस सॉर्ट करने के बजाय नया ऐरे भी देता है ।
परीक्षा
यदि हम निम्न input
सरणी लेते हैं , तो शुरू में इसके अनुसार हल करें 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 }
]
फिर इसका height
उपयोग करके सॉर्ट करें stableSort
:
stableSort(input, (a, b) => a.height - b.height)
का परिणाम:
// 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 }
]
हालाँकि input
बिल्ट-इन Array.sort()
(Chrome / NodeJS में) समान सरणी को छांटना:
input.sort((a, b) => a.height - b.height)
यह दिखाता है:
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 }
]
साधन
अपडेट करें
Array.prototype.sort
अब V8 v7.0 / Chrome 70 में स्थिर है!
पहले, V8 ने 10 से अधिक तत्वों के साथ सरणियों के लिए एक अस्थिर QuickSort का उपयोग किया था। अब, हम स्थिर TimSort एल्गोरिथ्म का उपयोग करते हैं।
स्रोत