Shell Sort هو نوع من فرز الإدراج، وهو إصدار أكثر كفاءة ومحسنًا من فرز الإدراج المباشر، ويستفيد بشكل كامل من خاصيتين لفرز الإدراج:
1) فعال للغاية عندما يكون حجم البيانات صغيرًا.
2) التعقيد الزمني عندما يتم فرز البيانات المحددة بالفعل هو O(n).
لذلك، يقوم فرز Shell بتقسيم البيانات إلى عدة كتل في كل مرة لاستخدام فرز الإدراج، ثم يجمع هذه الكتل الصغيرة في كتل صغيرة أكبر بعد فرزها، ويستمر في استخدام فرز الإدراج لدمج القطع الصغيرة بشكل مستمر حتى القطعة الصغيرة الأخيرة .
هنا، يتم التحكم في كل تقسيم إلى عدة كتل صغيرة عن طريق "الزيادة". في البداية، تكون الزيادة كبيرة، قريبة من n/2، بحيث يكون التقسيم قريبًا من n/2 من الكتل الصغيرة، وتكون "الزيادة" تدريجيًا. تم تخفيضه "، تم تخفيضه في النهاية إلى 1.
على سبيل المثال:
publicclassMain{publicstaticintcount=0;publicstaticvoidshellSort(int[]data){// احسب الحد الأقصى لقيمة h inth=1;while(h<=data.length/3){h=h*3+1;}while(h > 0){for(inti=h;i<data.length;i+=h){if(data[i]<data[ih]){inttmp=data[i];intj=ih;while(j>= 0&&data [j]>tmp){data[j+h]=data[j];j-=h;}data[j+h]=tmp;print(data);}}// احسب قيمة h التالية h= (h-1)/3;}}publicstaticvoidprint(int[]data){for(inti=0;i<data.length;i++){System.out.print(data[i]+t }System.out .out.println();}publicstaticvoidmain(String[]args){int[]data=newint[]{4,6,1,9,5,8};print(data);shellSort(data); بيانات)؛}}
نتائج التشغيل هي كما يلي:
461958146958145698145689145689