يؤدي فرز التل بشكل جيد لفرز المصفوفة متوسطة الحجم التي تصل إلى عدة آلاف من عناصر البيانات، كما أن فرز التل ليس بنفس سرعة الفرز السريع وخوارزميات الفرز الأخرى ذات التعقيد الزمني O(n*logn). ليس الخيار الأمثل لفرز الملفات الكبيرة جدًا، ولكن فرز التل أسرع بكثير من فرز التحديد وفرز الإدراج، اللذين لهما تعقيد زمني يبلغ O(n²)، وهو سهل التنفيذ للغاية والكود قصير.
الفرز على التل هو أيضًا نوع من الفرز بالإدراج، إذا كان هناك عدد كبير جدًا من النسخ، فهو يحل هذه المشكلة أيضًا، وفكرته هي زيادة التباعد العناصر في فرز الإدراج، وإجراء فرز الإدراج بين عناصر التباعد هذه، وعندما يتم فرز عناصر البيانات هذه مرة واحدة، فإن خوارزمية الفرز هيل تقلل التباعد بين عناصر البيانات ثم تقوم بفرزها، وهكذا. يسمى التباعد بين عناصر البيانات عند إجراء هذه الأنواع بالزيادة، ويتم تمثيله تقليديًا بالحرف h.
بالنسبة للمصفوفة التي على وشك الفرز بواسطة Hill، يجب أن يكون الفاصل الزمني للبدء أكبر، ومن ثم يجب تقليل الفاصل الزمني بشكل مستمر حتى يصبح الفاصل الزمني 1.
تسلسل فاصل:
غالبًا ما تُعتبر جودة الأرقام في التسلسلات المتباعدة أمرًا مهمًا - حيث لا يوجد بها قواسم مشتركة غير 1. يزيد هذا القيد من احتمالية أن تحافظ كل تمريرة فرز على تأثير التمريرة السابقة بالنسبة للتسلسلات المتباعدة المختلفة، هناك مطلق الشرط هو أن الفاصل الزمني المتناقص تدريجيًا يجب أن يساوي في النهاية 1. لذلك، فإن التمرير الأخير هو نوع إدراج عادي.
الأمثلة المذكورة أدناه مستمدة من القاعدة h=h*3+1:
package com.jll.sort; public class ShellSort { int[] arr; public ShellSort() { super(); } /** * @param args */ public static void main(String[] args) { ShellSort ss = new ShellSort(10); i=0;i<10;i++){ ss.arr[i] = (int) ((Math.random()*100)+1); System.out.print(ss.arr[i]+" " } ss.shellSort(); System.out.println(); System.out.print(ss.arr[i]+" ""); public void shellSort(){ int h = 1; while(h<=size/3){ h = h*3+1 } for (;h>0;h=(h-1)/3){ for(int i=h;i<size;i++){ int temp = arr[i]; while(j>h-1&&arr[jh]>temp){ arr[j]=arr[jh];