أخذ فرز عدد صحيح تصاعدي كمثال ، شرح موجز لعملية فرز الفقاعة ثنائية الاتجاه: أولاً ، انقل الرقم القصوى من الأمام إلى الخلف إلى النهاية ، ثم بدوره تحرك أصغر رقم من الخلف إلى الأمام إلى الأمام من المقدمة صفيف. يعد فرز الفقاعات ثنائي الاتجاه أفضل قليلاً من فرز الفقاعات التقليدية ، لأن كلا طرفي الصفيف يتم فرزه جيدًا أثناء الفرز ثنائي الاتجاه ، نحتاج فقط إلى معالجة الجزء الأوسط من الصفيف ، في اتجاه واحد ، أي فرز الفقاعة التقليدي ، فقط العناصر في الذيل. على الرغم من أنه تحسن قليلاً في الكفاءة ، إلا أنه لا يمكنه تحسين كفاءة الفرز بشكل كبير ، والذي يتم تحديده من خلال العملية الأساسية لفرز الفقاعة. على هذا الأساس ، تم تحسينه.
رمز مصدر فرز الفقاعات ثنائي الاتجاه:
نسخة الكود كما يلي:
حزمة com.zc.ManyTherD ؛
استيراد java.util.random ؛
/**
* نوع الفقاعة ثنائية الاتجاه
* Author أنا
*
*/
الفئة العامة bbsort {
// خوارزمية الفقاعة ثنائية الاتجاه تقلل إلى حد كبير من عدد مرات فرز الحلقة
Public Int [] Sort (int [] a) يلقي الاستثناء {
int j ؛
int limit = A.Length ؛
int st = -1 ؛
بينما (st <limit) {
// يجب تعيين ST والحد ، وإلا إذا تم طلب الصفيف من البداية
ST ++ ؛
حد--؛
تبديل منطقي = خطأ ؛
// الحلقة الأولى تضع القيمة القصوى حتى النهاية
لـ (j = st ؛ j <limit ؛ j ++) {
if (a [j]> a [j+1]) {
int t = a [j] ؛
a [j] = a [j+1] ؛
a [j+1] = t ؛
تبديل = صحيح ؛
}
}
إذا (! تبديل) {
إرجاع أ ؛
}آخر {
تبديل = خطأ ؛
// الحلقة الثانية تضع القيمة الدنيا في البداية
لـ (j = limit ؛ -j> = st ؛) {
if (a [j]> a [j+1]) {
int t = a [j] ؛
a [j] = a [j+1] ؛
a [j+1] = t ؛
تبديل = صحيح ؛
}
}
إذا (! تبديل) {
إرجاع أ ؛
}
}
}
إرجاع أ ؛
}
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 ؛
/* list.add (num) ؛* /// list
البيانات [i] = num ؛
}
إرجاع البيانات ؛
}
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
عدد int النهائي = 10 ؛
int [] data = createTate (count) ؛
لـ (int n: data) {
system.out.print (n+"/t") ؛
}
System.out.println () ؛
bsrot bsrot = bsrot جديد (بيانات) ؛
يحاول {
int [] a = bsrot.sort (data) ؛
لـ (int n: a) {
system.out.print (n+"/t") ؛
}
} catch (استثناء e) {
// TODO AUTO CATCH BLOCK
E.PrintStackTrace () ؛
}
}
}
نتائج التشغيل: