أولاً ، خذ عددًا صحيحًا D1 أصغر من N كزيادة أولى ، وقسم جميع السجلات في الملف إلى مجموعات من D1. يتم وضع جميع السجلات مع مضاعفات المسافة DL في نفس المجموعة. أولاً ، أدخل الفرز مباشرة في كل مجموعة ؛ يتم وضع جميع السجلات في نفس المجموعة ويتم فرزها مباشرة.
هذه الطريقة هي في الأساس طريقة إدخال التجميع.
تخطيطي:
رمز المصدر
نسخة الكود كما يلي:
حزمة com.zc.ManyTherD ؛
/**
*
* Author أنا
*
*/
الطبقة العامة شلسورت {
العد الثابت العام = 0 ؛
shellsort الفراغ الثابت العام (int [] data) {
// احسب أقصى قيمة H
int h = 1 ؛
بينما (h <= data.length / 3) {
H = H * 3 + 1 ؛
}
بينما (H> 0) {
لـ (int i = h ؛ i <data.length ؛ i += h) {
if (Data [i] <data [i - h]) {
int tmp = data [i] ؛
int j = i - h ؛
بينما (j> = 0 && data [j]> tmp) {
البيانات [J + H] = البيانات [J] ؛
J -= H ؛
}
البيانات [J + H] = TMP ؛
طباعة (بيانات) ؛
}
}
// احسب القيمة H التالية
H = (H - 1) / 3 ؛
}
}
طباعة باطلة ثابتة (بيانات int []) {
لـ (int i = 0 ؛ i <data.length ؛ i ++) {
system.out.print (data [i] + "/t") ؛
}
System.out.println () ؛
}
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
int [] data = new int [] {4 ، 3 ، 6 ، 2 ، 1 ، 9 ، 5 ، 8 ، 7} ؛
طباعة (بيانات) ؛
Shellsort (البيانات) ؛
طباعة (بيانات) ؛
}
}
نتائج التشغيل:
فرز الصدفة غير مستقر ، ومساحة النفقات العامة هو أيضا O (1) ، ويقدر الوقت النفقات العامة بين O (N3/2) و O (N7/6).