دمج هو دمج اثنين (أو أكثر من اثنين) الجداول المطلوبة في جدول جديد مرتبة ، أي تقسيم التسلسل المراد فرزه إلى عدة متسلسلات ، يتم طلب كل بعد. ثم يتم الجمع بين اللاتينات المطلوبة في التسلسل المطلوب بشكل عام.
دمج الفرز هو خوارزمية فرز فعالة تستند إلى عملية دمج. هذه الخوارزمية هي تطبيق نموذجي للغاية للانقسام والقهر. قم بدمج التسلسلات المرتبة للحصول على تسلسل تم ترتيبها بالكامل ؛ إذا تم دمج جدولين تم طلبهما في جدول واحد مرتبة ، يسمى دمج ثنائي الاتجاه.
تتطلب خوارزمية الفرز المستقرة ليس تكيفيا ولا يتطلب بيانات عشوائية.
كيف تعمل:
1. التقدم بطلب للحصول على مساحة بحيث يكون حجمه هو مجموع تسلسلتين فرزتين ، والذي يتم استخدامه لتخزين التسلسلات المشتركة
2. تعيين مؤشرين ، المواضع الأولية هي مواضع البداية للتسلسل المصنفين على التوالي.
3. قارن العناصر التي أشار إليها مؤشران ، وحدد عناصر صغيرة نسبيًا ووضعها في مساحة الدمج ، ونقل المؤشر إلى الوضع التالي
4. كرر الخطوة 3 حتى يصل المؤشر إلى نهاية التسلسل
5. انسخ جميع العناصر المتبقية من تسلسل آخر مباشرة إلى نهاية التسلسل المدمج
تشغيل الرمز
نسخة الكود كما يلي:
حزمة com.zc.ManyTherD ؛
استيراد java.util.random ؛
/**
* الطلب
* Author أنا
*
*/
الطبقة العامة دمج {
دمج الفراغ الثابت العام (بيانات int []) {
الفرز (البيانات ، 0 ، data.length - 1) ؛
}
فرز الفراغ الثابت العام (int [] البيانات ، int اليسار ، int اليمين) {
إذا (اليسار> = يمين)
يعود؛
// ابحث عن الفهرس المتوسط
int center = (يسار + يمين) / 2 ؛
// العودية الصفيف الأيسر
فرز (البيانات ، اليسار ، المركز) ؛
// العودية الصفيف الأيمن
فرز (البيانات ، المركز + 1 ، يمين) ؛
// دمج
دمج (البيانات ، اليسار ، الوسط ، يمين) ؛
طباعة (بيانات) ؛
}
/**
* دمج المصفوفتين ، ودمج المصفوفتين الأولين في النظام ، وما زال الطلب بعد الاندماج
*
* param بيانات
* كائن صفيف
* @param اليسار
* فهرس العنصر الأول من الصفيف الأيسر
* مركز param
* فهرس العنصر الأخير من الصفيف الأيسر ، المركز+1 هو فهرس العنصر الأول من الصفيف الأيمن
* param الحق
* فهرس العنصر الأخير من الصفيف الأيمن
*/
دمج الفراغ الثابت العام (int [] البيانات ، int اليسار ، مركز int ، int يمين) {
// صفيف مؤقت
int [] tmparr = new int [data.length] ؛
// فهرس العنصر الأول من الصفيف الأيمن
int mid = center + 1 ؛
// السجل الثالث فهرس المصفوفة المؤقتة
int الثالث = اليسار ؛
// ذاكرة التخزين المؤقت فهرس العنصر الأول من الصفيف الأيسر
int tmp = اليسار ؛
بينما (اليسار <= center && mid <= right) {
// أخرج الأصغر من المصفمين ووضعها في الصفيف المؤقت
if (البيانات [اليسار] <= البيانات [mid]) {
tmparr [Third ++] = Data [Left ++] ؛
} آخر {
tmparr [third ++] = data [mid ++] ؛
}
}
// ضع الأجزاء المتبقية في المصفوفة المؤقتة بدورها (في الواقع ، واحد فقط من الاثنين بينما سيتم تنفيذها)
بينما (منتصف <= يمين) {
tmparr [third ++] = data [mid ++] ؛
}
بينما (اليسار <= الوسط) {
tmparr [Third ++] = Data [Left ++] ؛
}
// انسخ محتويات الصفيف المؤقت مرة أخرى إلى الصفيف الأصلي
// (يتم نسخ محتوى النطاق الأيسر الأصلي إلى الصفيف الأصلي)
بينما (TMP <= يمين) {
البيانات [TMP] = tmparr [tmp ++] ؛
}
}
طباعة باطلة ثابتة (بيانات int []) {
لـ (int i = 0 ؛ i <data.length ؛ i ++) {
system.out.print (data [i] + "/t") ؛
}
System.out.println () ؛
}
/**
* إنشاء صفيف عشوائي
* @param العد
* @يعود
*/
int static int [] تم إنشاؤه (عدد int) {
int [] data = new int [count] ؛
Rand Rand = New Random () ؛
Boolean [] Bool = New Boolean [100] ؛
int num = 0 ؛
لـ (int i = 0 ؛ i <count ؛ i ++) {
يفعل {
// إذا كان الرقم الذي تم إنشاؤه هو نفسه ، فاستمر في الحلقة
num = rand.nextint (100) ؛
} بينما (bool [num]) ؛
Bool [num] = true ؛
البيانات [i] = num ؛
}
إرجاع البيانات ؛
}
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
int [] data = createTate (10) ؛
طباعة (بيانات) ؛
Mergesort (البيانات) ؛
System.out.println ("صفيف فرز:") ؛
طباعة (بيانات) ؛
}
}
نتائج التشغيل:
ما سبق هو كل شيء عن هذا المقال ، آمل أن تتمكن من إعجابك به.