دمج فرز هو خوارزمية فرز فعالة تستند إلى عملية دمج. هذه الخوارزمية هي تطبيق نموذجي للغاية للانقسام والقهر.
تتمثل طريقة فرز الدمج في دمج جدولين مرتبة (أو أكثر من اثنين) في جدول جديد مرتبة ، أي تقسيم التسلسل المراد فرزه إلى عدة متابعات ، يتم طلب كل بعد. ثم يتم الجمع بين اللاتينات المطلوبة في التسلسل المطلوب بشكل عام.
دمج الفرز هو خوارزمية فرز فعالة تستند إلى عملية دمج. هذه الخوارزمية هي تطبيق نموذجي للغاية للانقسام والقهر. قم بدمج التسلسلات المرتبة للحصول على تسلسل تم ترتيبها بالكامل ؛ إذا تم دمج جدولين تم طلبهما في جدول واحد مرتبة ، يسمى دمج ثنائي الاتجاه.
عملية عملية الدمج هي كما يلي:
1. تقدم بطلب للحصول على مساحة بحيث يكون حجمه هو مجموع تسلسلتين فرزتين ، والذي يتم استخدامه لتخزين التسلسلات المدمجة
2. تعيين مؤشرين ، الموضع الأولي هو موضع البداية للتسلسل المصنفين على التوالي
3. قارن العناصر التي أشار إليها مؤشران ، وحدد عناصر صغيرة نسبيًا ووضعها في مساحة الدمج ، ونقل المؤشر إلى الوضع التالي
4. كرر الخطوة 3 حتى يصل المؤشر إلى نهاية التسلسل
5. انسخ جميع العناصر المتبقية من تسلسل آخر مباشرة إلى نهاية تسلسل الدمج
مثال 1:
نسخة الكود كما يلي:
/**
* الدمج ، المعروف أيضًا باسم خوارزمية الدمج ، يشير إلى تشغيل الجمع بين تسلسلين فرزتين في تسلسل واحد.
* تعتمد خوارزمية فرز الدمج على عملية الدمج.
*
* عملية الاندماج هي كما يلي:
*
* 1. تقدم بطلب للحصول على مساحة بحيث يكون حجمه هو مجموع تسلسلتين فرزتين ، والذي يستخدم لتخزين التسلسلات المدمجة
*.
* 3. قارن العناصر التي أشار إليها المؤشران ، وتحديد عناصر صغيرة نسبيًا ووضعها في مساحة الدمج ، وحرك المؤشر إلى الوضع التالي
* 4. كرر الخطوة 3 حتى يصل المؤشر إلى نهاية التسلسل
* 5. انسخ جميع العناصر المتبقية من تسلسل آخر مباشرة إلى نهاية التسلسل المدمج
*
*/
دالة دمج (عناصر) {
if (items.length <2) {
إرجاع العناصر ؛
}
var middle = math.floor (items.length / 2) ،
اليسار = العناصر. مرسلة (0 ، منتصف) ،
يمين = items.slice (الأوسط) ،
params = merge (mergesort (يسار) ، mergesort (يمين)) ؛
params.unshift (0 ، items.length) ؛
items.splice.apply (العناصر ، params) ؛
إرجاع العناصر ؛
دمج الوظيفة (يسار ، يمين) {
نتيجة var = [] ،
il = 0 ،
IR = 0 ؛
بينما (il <left.length && ir <right.length) {
if (left [il] <right [ir]) {
result.push (اليسار [il ++]) ؛
} آخر {
result.push (يمين [ir ++]) ؛
}
}
return result.concat (left.slice (il)) .Concat (right.slice (ir)) ؛
}
}
// امتحان
var arr = [2 ، 1 ، 3 ، 12 ، 5 ، 66 ، 23 ، 87 ، 15 ، 32] ؛
Mergesort (ARR) ؛
مثال 2:
نسخة الكود كما يلي:
<script type = "text/javaScript">
//document.write("-------------------------------------------- ------------------------------------------------- -----------------------
// var array = صفيف جديد (12 ، 25 ، 32 ، 16 ، 18 ، 27 ، 59 ، 69 ، 36) ؛
var count = 0 ؛
// استدعاء طريقة الفرز للفرز
// msort (Array ، Array ، 0 ، Array.Length - 1) ؛
// مصدر صفيف مصدر
// مصفوفة الهدف القدر
// S START Subcript
// ttarget subcript
وظيفة MSORT (المصدر ، القدر ، S ، T) {
var result = "" ؛
var m ؛
var dest2 = new array () ؛
إذا (s == t) {
القدر [s] = المصدر [s] ؛
}
آخر {
m = math.floor ((s + t) / 2) ؛
MSORT (Source ، Dest2 ، S ، M) ؛
MSORT (Source ، dest2 ، m+1 ، t) ؛
دمج (dest2 ، dest ، s ، m ، t) ؛
/* نتيجة الإخراج*/
النتيجة += "<br /> thread" +++ count +"نتيجة الطلب من خلال الممر هي:" ؛
لـ (var n = 0 ؛ n <dest.length ؛ n ++) {
النتيجة + = صفيف [n] + "،" ؛
}
/* تنتهي نتيجة الإخراج*/
}
نتيجة العودة
}
/* تنتهي نتيجة الإخراج*/
// دمج صفيفتين بالترتيب من صغير إلى كبير
// مصدر صفيف الأصلي
// مصفوفة المصير
// STHE First Subscript
// م الجدول التالي من المصفوفة الثانية
// طول ntotal
دمج الوظيفة (المصدر ، القدر ، S ، م ، ن) {
لـ (var j = m+1 ، k = s ؛ j <= n && s <= m ؛ k ++) {
if (Source [s] <source [j]) {
القدر [k] = المصدر [s ++] ؛
}
آخر {
القدر [k] = المصدر [j ++] ؛
}
}
// أضف المصفوفات المتبقية المتبقية إلى نهاية القدر
if (s <= m) {
لـ (var l = 0 ؛ l <= m - s ؛ l ++) {
القدر [k + l] = المصدر [s + l] ؛
}
}
إذا (j <= n) {
لـ (var l = 0 ؛ l <= n - j ؛ l ++) {
القدر [k + l] = المصدر [j + l] ؛
}
}
}
//document.write(" <br /> <br /> ")
</script>