مقدمة
ينتمي فرز التل (تقليل الطريقة الإضافية) إلى فرز فئة الإدراج. يقترحه شل. قام فرز التل بتحسينات بسيطة لفرز الإدراج المباشر: فهو يزيد من الفاصل بين العناصر في فرز الإدراج وإدراجه في هذه العناصر الفاصلة ، مما يؤدي إلى تحرك عناصر البيانات عبر فترة كبيرة. بعد فرز عناصر البيانات هذه مرة واحدة ، تقلل خوارزمية فرز التل من فاصل عناصر البيانات ثم فرزها ، وتستمر بدورها. الفاصل الزمني بين عناصر البيانات عندما يسمى هذا الفرز الزيادات ، ويتم استخدام الحرف H لتمثيل هذه الزيادة.
يتم اقتراح تسلسل H شائع الاستخدام بواسطة Knuth. يبدأ هذا التسلسل من 1 ويتم إنشاؤه بواسطة الصيغة التالية:
H = 3 * H +1
يحتاج البرنامج بدوره إلى حساب تسلسل H في الاتجاه المعاكس ، ويجب استخدامه
H = (H-1)/3
تنفيذ الكود
رمز التنفيذ 1:
shellsort الفراغ الثابت العام (int [] arr) {int temp ؛ لـ (int delta = arr.length/2 ؛ delta> = 1 ؛ delta/= 2) {// قم بفرز كل زيادة مرة واحدة لـ (int i = delta ؛ i <arr.length ؛ i ++) {for (int j = i ؛ j> = delta && arr [j] <arr [ar-delta] ؛ j- = delta) arr [j-delta] = arr [j] ؛ arr [j] = temp ؛ }} // loop i} // loop delta}رمز التنفيذ 2:
public static void shellsort2 (int [] arr) {int delta = 1 ؛ بينما (delta <arr.length/3) {// إنشاء دلتا delta = delta*3+1 ؛ // <o (n^(3/2)) by Knuth ، 1973>: 1 ، 4 ، 13 ، 40 ، 121 ، ...} int temp ؛ لـ (؛ delta> = 1 ؛ delta/= 3) {for (int i = delta ؛ i <arr.length ؛ i ++) {for (int j = i ؛ j> = delta && arr [j] <arr [j-delta] ؛ j- = delta) {temp = arr [j-delta] ؛ arr [j-delta] = arr [j] ؛ arr [j] = temp ؛ }} // loop i} // loop delta} عندما يقارنه البرنامج أعلاه بطريقة الإدراج المباشر ، ستجد أن الفرق بينه وبين نوع الإدراج المباشر هو أنه سيتم استبدال H في نوع الإدراج المباشر بـ 1.
فرز الصدفة غير مستقر ، ومساحة النفقات العامة هو أيضا O (1) ، ويقدر الوقت النفقات العامة بين O (N3/2) و O (N7/6).