উত্তর:
আমি কেবল ওয়েবকিট (ক্রোম, সাফারি…) উত্সটি দেখেছি । অ্যারের ধরণের উপর নির্ভর করে বিভিন্ন ধরণের পদ্ধতি ব্যবহার করা হয়:
C ++ স্ট্যান্ডার্ড লাইব্রেরি ফাংশন ব্যবহার করে সংখ্যাসূচক অ্যারেগুলি (বা প্রিমিটিভ টাইপের অ্যারেগুলি) বাছাই করা হয় std::qsort
যা কুইকোর্টের কিছু প্রকরণ (সাধারণত ইনট্রোসোর্ট ) প্রয়োগ করে ।
সংখ্যাসূচক সংখ্যার ধরণের অ্যারেগুলি মার্জসর্ট ব্যবহার করে স্ট্রিংফাইড এবং বাছাই করা থাকে, যদি পাওয়া যায় (স্থিতিশীল বাছাই পেতে) অথবা qsort
যদি কোনও মার্জ সাজ্ট পাওয়া যায় না।
অন্যান্য ধরণের জন্য (অ-সংঘবদ্ধ অ্যারে এবং সম্ভবত এসোসিয়েটিভ অ্যারেগুলির জন্য) ওয়েবকিট বাছাই বাছাই (যা তারা "মিনিট" বাছাই করে ) ব্যবহার করে বা কোনও কোনও ক্ষেত্রে এটি কোনও এভিএল গাছের মাধ্যমে সাজিয়ে তোলে। দুর্ভাগ্যক্রমে, এখানে ডকুমেন্টেশনটি অস্পষ্ট তাই আপনাকে কোন ধরণের পদ্ধতিটি ব্যবহার করা হয় তা দেখতে আসলে কোডের সন্ধান করতে হবে।
এবং তারপরে এই মন্তব্যের মতো রত্ন রয়েছে :
// FIXME: Since we sort by string value, a fast algorithm might be to use a
// radix sort. That would be O(N) rather than O(N log N).
- আসুন আমরা কেবল আশা করি যে এই মন্তব্যটির লেখকের তুলনায় যিনি আসলে "সংশোধন" করেছেন এটি অ্যাসিম্পটোটিক রানটাইম সম্পর্কে আরও ভাল বোঝার আছে এবং বুঝতে পেরেছেন যে রেডিক্স সাজানোর ক্ষেত্রে ও (এন) এর চেয়ে কিছুটা জটিল রানটাইম বর্ণনা রয়েছে।
(মূল উত্তরে ত্রুটিটি নির্দেশ করার জন্য পিএসসোর্সকে ধন্যবাদ।)
জেএসের একটি নির্দিষ্ট বাছাইকরণ অ্যালগরিদম ব্যবহার করার জন্য কোনও খসড়ার প্রয়োজন নেই। যেমনটি এখানে উল্লেখ করেছেন, মজিলা মার্জ সাজ্ট ব্যবহার করে Chrome যাইহোক, ক্রোমের ভি 8 উত্স কোডে, আজকের হিসাবে এটি কুইকসোর্ট এবং ইনসারেশনসোর্টটি ছোট অ্যারেগুলিতে ব্যবহার করে।
807 - 891 লাইন থেকে
var QuickSort = function QuickSort(a, from, to) {
var third_index = 0;
while (true) {
// Insertion sort is faster for short arrays.
if (to - from <= 10) {
InsertionSort(a, from, to);
return;
}
if (to - from > 1000) {
third_index = GetThirdIndex(a, from, to);
} else {
third_index = from + ((to - from) >> 1);
}
// Find a pivot as the median of first, last and middle element.
var v0 = a[from];
var v1 = a[to - 1];
var v2 = a[third_index];
var c01 = comparefn(v0, v1);
if (c01 > 0) {
// v1 < v0, so swap them.
var tmp = v0;
v0 = v1;
v1 = tmp;
} // v0 <= v1.
var c02 = comparefn(v0, v2);
if (c02 >= 0) {
// v2 <= v0 <= v1.
var tmp = v0;
v0 = v2;
v2 = v1;
v1 = tmp;
} else {
// v0 <= v1 && v0 < v2
var c12 = comparefn(v1, v2);
if (c12 > 0) {
// v0 <= v2 < v1
var tmp = v1;
v1 = v2;
v2 = tmp;
}
}
// v0 <= v1 <= v2
a[from] = v0;
a[to - 1] = v2;
var pivot = v1;
var low_end = from + 1; // Upper bound of elements lower than pivot.
var high_start = to - 1; // Lower bound of elements greater than pivot.
a[third_index] = a[low_end];
a[low_end] = pivot;
// From low_end to i are elements equal to pivot.
// From i to high_start are elements that haven't been compared yet.
partition: for (var i = low_end + 1; i < high_start; i++) {
var element = a[i];
var order = comparefn(element, pivot);
if (order < 0) {
a[i] = a[low_end];
a[low_end] = element;
low_end++;
} else if (order > 0) {
do {
high_start--;
if (high_start == i) break partition;
var top_elem = a[high_start];
order = comparefn(top_elem, pivot);
} while (order > 0);
a[i] = a[high_start];
a[high_start] = element;
if (order < 0) {
element = a[i];
a[i] = a[low_end];
a[low_end] = element;
low_end++;
}
}
}
if (to - high_start < low_end - from) {
QuickSort(a, high_start, to);
to = low_end;
} else {
QuickSort(a, from, low_end);
from = high_start;
}
}
};
2018 ভি 8 আপডেট করুন টিমসোর্ট ব্যবহার করে, ধন্যবাদ @ মেলওয়েল। উৎস
ECMAscript মানটি কোন ধরণের অ্যালগরিদম ব্যবহার করতে হবে তা নির্দিষ্ট করে না। প্রকৃতপক্ষে, বিভিন্ন ব্রাউজারে বিভিন্ন ধরণের অ্যালগোরিদম থাকে। উদাহরণস্বরূপ, মানচিত্র বাছাই করার সময় মজিলা / ফায়ারফক্সের বাছাই () শব্দটির বাছাইয়ের অর্থে স্থিতিশীল নয় । আই এর ধরণ () স্থিতিশীল।
Array.sort
; দেখতে এই প্রশ্নের ।
আরও কিছু গবেষণার পরে, এটি প্রদর্শিত হবে, মজিলা / ফায়ারফক্সের জন্য, অ্যারে.সোর্ট () একত্রিত করা ব্যবহার করে। কোডটি এখানে দেখুন ।
আমি মনে করি এটি ব্রাউজার বাস্তবায়নের উপর নির্ভর করবে যা আপনি উল্লেখ করছেন।
প্রতিটি ব্রাউজারের নিজস্ব জাভাস্ক্রিপ্ট ইঞ্জিন বাস্তবায়ন থাকে, তাই এটি নির্ভর করে। আপনি বিভিন্ন বাস্তবায়নের জন্য মোজিলা এবং ওয়েবকিট / Khtml এর উত্সকোড রেপো পরীক্ষা করতে পারেন।
IE তবে উত্স বন্ধ, তাই আপনাকে মাইক্রোসফ্টে কারও কাছে জিজ্ঞাসা করতে হতে পারে।
ভি 8 ভি 7.0 / ক্রোম 70 হিসাবে, ভি 8 পাইথনের বাছাই করা অ্যালগরিদম টিমসোর্ট ব্যবহার করে । ক্রোম 70 প্রকাশিত হয়েছে 13 ই সেপ্টেম্বর, 2018।
এই পরিবর্তন সম্পর্কে বিস্তারিত জানার জন্য ভি 8 ডি ব্লগে পোস্টটি দেখুন । আপনি উত্স কোড বা প্যাচ 1186801 পড়তে পারেন ।
জাভাস্ক্রিপ্টের অ্যারে.সোর্ট () ফাংশনে অ্যারে উপাদানগুলির ডেটাটাইপের ভিত্তিতে সেরা বাছাই করা অ্যালগরিদম (কুইকসোর্ট, মার্জসর্ট, ইত্যাদি) নির্বাচন করার জন্য অভ্যন্তরীণ প্রক্রিয়া রয়েছে।
দ্রুত সাজানোর মাধ্যমে এ চেষ্টা করুন:
function sort(arr, compareFn = (a, b) => a <= b) {
if (!arr instanceof Array || arr.length === 0) {
return arr;
}
if (typeof compareFn !== 'function') {
throw new Error('compareFn is not a function!');
}
const partition = (arr, low, high) => {
const pivot = arr[low];
while (low < high) {
while (low < high && compareFn(pivot, arr[high])) {
--high;
}
arr[low] = arr[high];
while (low < high && compareFn(arr[low], pivot)) {
++low;
}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
};
const quickSort = (arr, low, high) => {
if (low < high) {
let pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
return arr;
};
return quickSort(arr, 0, arr.length - 1);
}