خوارزمية الفرز

فرز الدمج

في علم الحاسوب ، تُعرَّف خوارزمية الفرز بأنها خوارزمية تُرتِّب عناصر القائمة . وأكثر أنواع الفرز شيوعًا هي الترتيب العددي والترتيب المعجمي ، بالإضافة إلى الترتيب التصاعدي أو التنازلي. يُعدّ الفرز الفعال مهمًا لتحسين كفاءة الخوارزميات الأخرى (مثل خوارزميات البحث والدمج ) التي تتطلب أن تكون بيانات الإدخال في قوائم مُرتَّبة . كما يُفيد الفرز غالبًا في توحيد البيانات وإنتاج مخرجات سهلة القراءة.

بصورة رسمية، يجب أن تستوفي مخرجات أي خوارزمية فرز شرطين:

  1. يكون الناتج بترتيب رتيب (كل عنصر ليس أصغر/أكبر من العنصر السابق، وفقًا للترتيب المطلوب).
  2. الناتج هو تبديل (إعادة ترتيب مع الاحتفاظ بجميع العناصر الأصلية) للمدخلات.

على الرغم من أن بعض الخوارزميات مصممة للوصول التسلسلي ، إلا أن الخوارزميات ذات الأداء الأعلى تفترض أن البيانات مخزنة في بنية بيانات تسمح بالوصول العشوائي .

التاريخ والمفاهيم

منذ بدايات الحوسبة، حظيت مسألة الفرز باهتمام بحثي واسع، ربما لصعوبة حلها بكفاءة رغم بساطتها ووضوحها. من بين مؤلفي خوارزميات الفرز الأولى حوالي عام 1951، كانت بيتي هولبرتون ، التي عملت على حاسوبي ENIAC و UNIVAC . [ 1 ] [ 2 ] وتم تحليل فرز الفقاعات في وقت مبكر من عام 1956. [ 3 ] وقد عُرفت الخوارزميات المثلى تقاربياً منذ منتصف القرن العشرين ، ولا تزال تُبتكر خوارزميات جديدة، حيث يعود تاريخ خوارزمية Timsort واسعة الانتشار إلى عام 2002، ونُشرت خوارزمية فرز المكتبة لأول مرة عام 2006. 

تتطلب خوارزميات فرز المقارنة شرطًا أساسيًا هونسجلن-1.4427ن+يا(سجلن){\displaystyle n\log {n}-1.4427n+O(\log {n})}المقارنات. يمكن أن يكون للخوارزميات التي لا تعتمد على المقارنات، مثل فرز العد ، أداء أفضل.

تنتشر خوارزميات الفرز في فصول علوم الحاسوب التمهيدية ، حيث يوفر وفرة الخوارزميات للمشكلة مقدمة سلسة لمجموعة متنوعة من مفاهيم الخوارزميات الأساسية، مثل ترميز Big O ، وخوارزميات فرق تسد ، وهياكل البيانات مثل الأكوام والأشجار الثنائية ، والخوارزميات العشوائية ، وتحليل أفضل وأسوأ ومتوسط ​​الحالات ، والمفاضلات بين الوقت والمساحة ، والحدود العليا والسفلى .

لا يزال فرز المصفوفات الصغيرة على النحو الأمثل (بأقل عدد من المقارنات والتبديلات) أو بسرعة (أي مع مراعاة خصائص الجهاز) يمثل مشكلة بحثية مفتوحة، ولا تتوفر حلول معروفة إلا للمصفوفات الصغيرة جدًا (أقل من 20 عنصرًا). وبالمثل، يُعد الفرز الأمثل (وفقًا لتعريفات مختلفة) على جهاز متوازٍ موضوعًا بحثيًا مفتوحًا.

تصنيف

يمكن تصنيف خوارزميات الفرز حسب:

  • التعقيد الحسابي
    • أفضل وأسوأ ومتوسط ​​أداء الخوارزمية من حيث حجم القائمة. بالنسبة لخوارزميات الفرز التسلسلي التقليدية، يكون الأداء الجيد O(n log  n ) ، بينما يكون الفرز المتوازي O(log₂n ) ، أما الأداء السيئ فهو O( ) . يُعدّ الأداء الأمثل للفرز التسلسلي O( n )، لكن هذا غير ممكن في الحالة المتوسطة. أما الفرز المتوازي الأمثل فهو O(log n ) .   
    • استبدال الخوارزميات "الموجودة في مكانها".
  • استخدام الذاكرة (واستخدام موارد الحاسوب الأخرى). على وجه الخصوص، بعض خوارزميات الفرز " موضعية ". من الناحية الدقيقة، لا يحتاج الفرز الموضعي إلا إلى ذاكرة O(1) بعد العناصر المراد فرزها؛ وفي بعض الأحيان تُعتبر ذاكرة إضافية O(log n ) "موضعية". 
  • الاستدعاء الذاتي: بعض الخوارزميات إما أن تكون عادةً استدعاء ذاتي أو عادةً غير استدعاء ذاتي، في حين أن البعض الآخر قد يكون عادةً كليهما (على سبيل المثال، فرز الدمج).
  • الاستقرار: تحافظ خوارزميات الفرز المستقرة على الترتيب النسبي للسجلات ذات المفاتيح المتساوية (أي القيم).
  • سواء كانت عملية فرز مقارنة أم لا ، فإن فرز المقارنة يفحص البيانات فقط من خلال مقارنة عنصرين باستخدام عامل المقارنة.
  • الطرق العامة: الإضافة، والتبادل، والاختيار، والدمج، إلخ. تشمل خوارزميات فرز التبادل فرز الفقاعات والفرز السريع. وتشمل خوارزميات فرز الاختيار فرز الدورة وفرز الكومة.
  • سواء كانت الخوارزمية تسلسلية أم متوازية. ويركز الجزء المتبقي من هذا النقاش بشكل شبه حصري على الخوارزميات التسلسلية ويفترض التشغيل التسلسلي.
  • القدرة على التكيف: ما إذا كان ترتيب المدخلات مسبقًا يؤثر على وقت التشغيل أم لا. ومن المعروف أن الخوارزميات التي تأخذ هذا في الاعتبار تتميز بقدرتها على التكيف .
  • عبر الإنترنت: يمكن لخوارزمية مثل فرز الإدراج التي تعمل عبر الإنترنت فرز تدفق مستمر من المدخلات.

استقرار

مثال على الفرز المستقر لأوراق اللعب. عند فرز الأوراق حسب رتبتها باستخدام الفرز المستقر، يجب أن تبقى ورقتي الرقم 5 بنفس الترتيب الأصلي في الناتج المفرز. أما عند فرزها باستخدام الفرز غير المستقر، فقد ينتهي الأمر بورقتي الرقم 5 بترتيب معاكس في الناتج المفرز.

تقوم خوارزميات الفرز المستقر بفرز العناصر المتساوية بنفس ترتيب ظهورها في المدخلات. على سبيل المثال، في مثال فرز البطاقات على اليمين، يتم فرز البطاقات حسب رتبتها، مع تجاهل نوعها. يتيح هذا إمكانية وجود نسخ متعددة ومرتبة بشكل صحيح من القائمة الأصلية. تختار خوارزميات الفرز المستقر إحدى هذه النسخ، وفقًا للقاعدة التالية: إذا كان عنصران متساويين (مثل بطاقتي الرقم 5)، فسيتم الحفاظ على ترتيبهما النسبي، أي إذا كان أحدهما يسبق الآخر في المدخلات، فسيسبق الآخر في المخرجات.

يُعدّ الاستقرار مهمًا للحفاظ على الترتيب عند إجراء عمليات فرز متعددة على نفس مجموعة البيانات . على سبيل المثال، لنفترض أن سجلات الطلاب التي تتكون من الاسم والشعبة الدراسية تُفرز ديناميكيًا، أولًا حسب الاسم، ثم حسب الشعبة الدراسية. إذا استُخدمت خوارزمية فرز مستقرة في كلتا الحالتين، فلن تُغيّر عملية الفرز حسب الشعبة الدراسية ترتيب الأسماء؛ أما مع خوارزمية فرز غير مستقرة، فقد يؤدي الفرز حسب الشعبة الدراسية إلى تغيير ترتيب الأسماء، مما ينتج عنه قائمة طلاب غير مرتبة أبجديًا.

بصورة أدق، يمكن تمثيل البيانات المراد فرزها كسجل أو مجموعة من القيم، ويُسمى الجزء من البيانات المستخدم في الفرز بالمفتاح . في مثال البطاقات، تُمثل البطاقات كسجل (الرتبة، النوع)، والمفتاح هو الرتبة. تكون خوارزمية الفرز مستقرة إذا كان هناك سجلان R و S لهما نفس المفتاح، وكان R يظهر قبل S في القائمة الأصلية، فإن R سيظهر دائمًا قبل S في القائمة المُفرزة.

عندما تكون العناصر المتساوية غير قابلة للتمييز، كما هو الحال مع الأعداد الصحيحة، أو بشكل عام، أي بيانات يكون فيها العنصر بأكمله هو المفتاح، فإن الاستقرار لا يمثل مشكلة. كما أن الاستقرار لا يمثل مشكلة إذا كانت جميع المفاتيح مختلفة.

يمكن تعديل خوارزميات الفرز غير المستقرة لتصبح مستقرة. إحدى طرق القيام بذلك هي توسيع نطاق مقارنة المفاتيح بشكل مصطنع، بحيث تُحسم المقارنات بين عنصرين لهما مفاتيح متطابقة باستخدام ترتيب العناصر في قائمة الإدخال الأصلية كمعيار فاصل. مع ذلك، قد يتطلب تذكر هذا الترتيب وقتًا ومساحة إضافيين.

من تطبيقات خوارزميات الفرز المستقر فرز قائمة باستخدام مفتاح أساسي ومفتاح ثانوي. على سبيل المثال، لنفترض أننا نريد فرز مجموعة من أوراق اللعب بحيث تكون أنواعها بالترتيب التالي: النوادي (♣)، والماس ( )، والقلوب ( )، والبستوني (♠)، وضمن كل نوع، يتم فرز الأوراق حسب رتبتها. يمكن القيام بذلك عن طريق فرز الأوراق أولاً حسب رتبتها (باستخدام أي خوارزمية فرز)، ثم إجراء فرز مستقر حسب النوع.

ضمن كل مجموعة أوراق، يحافظ الفرز المستقر على الترتيب حسب الرتبة الذي تم إجراؤه مسبقًا. يمكن توسيع هذه الفكرة لتشمل أي عدد من المفاتيح، وهي مستخدمة في فرز الجذر . يمكن تحقيق التأثير نفسه باستخدام فرز غير مستقر من خلال مقارنة المفاتيح المعجمية، والتي، على سبيل المثال، تقارن أولًا حسب المجموعة، ثم تقارن حسب الرتبة إذا كانت المجموعات متطابقة.

مقارنة الخوارزميات

يفترض هذا التحليل أن طول كل مفتاح ثابت وأن جميع المقارنات والتبديلات والعمليات الأخرى يمكن أن تتم في وقت ثابت.

أسطورة:

  • يمثل n عدد السجلات المراد فرزها.
  • يحتوي عمود المقارنة على تصنيفات الترتيب التالية: "الأفضل" و"المتوسط" و"الأسوأ" إذا تم تحديد التعقيد الزمني لكل حالة.
  • تشير كلمة "الذاكرة" إلى مقدار مساحة التخزين الإضافية التي تتطلبها الخوارزمية.
  • أوقات التشغيل ومتطلبات الذاكرة المدرجة موجودة داخل ترميز Big O ، وبالتالي فإن أساس اللوغاريتمات لا يهم.
  • الرمز log 2 n يعني (log n ) 2 .

أنواع المقارنة

فيما يلي جدول لأنواع خوارزميات المقارنة . يُظهر التحليل الرياضي أن خوارزمية المقارنة لا يمكنها أن تحقق أداءً أفضل من O ( n log n ) في المتوسط. [ 4 ]

أنواع المقارنة
اسمأفضلمتوسطأسوأذاكرةمستقرفي مكانهطريقةملاحظات أخرى
فرز الكومةنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}1لانعماختيارنسخة محسّنة من خوارزمية فرز الاختيار. تقوم هذه الخوارزمية بفرز الاختيار عن طريق إنشاء كومة قصوى والحفاظ عليها لإيجاد القيمة القصوى فييا(سجلن){\displaystyle O(\log n)}وقت.
إنتروسورتنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}سجلن{\displaystyle \log n}لانعمالتقسيم والاختياريُستخدم في العديد من تطبيقات مكتبة STL . يقوم بتنفيذ مزيج من خوارزميات الفرز السريع، وفرز الكومة، وفرز الإدراج.
فرز الدمجنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}ننعملاالاندماجقابل للتوازي بدرجة عالية (حتى O (log n ) باستخدام خوارزمية المجريين الثلاثة). [ 5 ]
فرز الدمج في مكانهن{\displaystyle n}نسجل2ن{\displaystyle n\log ^{2}n}نسجل2ن{\displaystyle n\log ^{2}n}سجلن{\displaystyle \log n}نعمنعمالاندماجنوع من أنواع فرز الدمج يستخدميا(نسجلن){\displaystyle O(n\log n)}خوارزمية دمج مستقرة في مكانها، مثل دمج الدوران أو الدمج المتناظر.
فرز البطولةنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}ننعملااختيارتحسين لخوارزمية فرز الاختيار، والتي تستخدم شجرة البطولة لاختيار الحد الأدنى/الأقصى.
فرز الشجرةنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}(متوازن)ننعملاالإدخالعند استخدام شجرة بحث ثنائية متوازنة ذاتيًا .
فرز الكتلننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}1نعمنعمالإضافة والدمجدمج نظام قائم على الكتليا(ن){\displaystyle O(n)}خوارزمية الدمج في مكانها [ 6 ] مع فرز الدمج من الأسفل إلى الأعلى .
سموث سورتننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}1لانعماختيارنسخة تكيفية من خوارزمية فرز الكومة تعتمد على متتالية ليوناردو بدلاً من الكومة الثنائية .
تيمسورتننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}ننعملاالإضافة والدمجيصنعن-1{\displaystyle n-1}المقارنات عندما تكون البيانات مرتبة بالفعل أو مرتبة بشكل عكسي.
فرز الصبرننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نلالاالإدخال والاختياريجد جميع أطول المتتاليات الفرعية المتزايدة في O ( n log n ) .
فرز المكعباتننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}ننعملاالإدخاليصنعن-1{\displaystyle n-1}المقارنات عندما تكون البيانات مرتبة بالفعل أو مرتبة بشكل عكسي.
فرز سريعنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}ن2{\displaystyle n^{2}}سجلن{\displaystyle \log n}لانعمالتقسيميمكن تنفيذ خوارزمية الفرز السريع في مكانها باستخدام مساحة مكدس تبلغ O (log n ) . [ 7 ] [ 8 ]
فلوكسورتننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}ننعملاالتقسيم والدمجنوع مستقر قابل للتكيف وغير متفرع.
فرز الكرمننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}سجلن{\displaystyle \log n}لانعمالتقسيم والدمجنسخة غير مستقرة من خوارزمية Fluxsort، ولكنها موجودة في مكانها.
فرز المكتبةنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}ن2{\displaystyle n^{2}}نلالاالإدخاليشبه فرز الإدراج المتقطع.
شلسورتنسجلن{\displaystyle n\log n}Ω(نسجلن){\displaystyle \Omega (n\log n)}يا(ن1+1/ك){\displaystyle O(n^{1+1/k})}(هندسي)نسجل2ن{\displaystyle n\log ^{2}n}(برات)1لانعمالإدخالحجم الكود صغير. يتأثر التعقيد بتسلسل الفجوات المستخدم. تسلسل برات هو أسوأ الحالات.Θ(نسجل2ن){\displaystyle \Theta (n\log ^{2}n)}وهو الأكثر شهرة. ولا تزال الحدود الدقيقة للحالة المتوسطة والأسوأ من المسائل المفتوحة.
فرز المشطنسجلن{\displaystyle n\log n}ن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1لانعمالتبادلأسرع من فرز الفقاعات في المتوسط.
فرز الإدراجنن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1نعمنعمالإدخالO ( n + d ) ، في أسوأ الحالات على التسلسلات التي تحتوي على d انعكاسات .
فرز الفقاعاتنن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1نعمنعمالتبادلحجم الكود صغير جدًا.
نوع من أنواع خلاطات الكوكتيلنن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1نعمنعمالتبادلنسخة ثنائية الاتجاه من خوارزمية فرز الفقاعات.
فرز الأقزامنن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1نعمنعمالتبادلحجم الكود صغير جدًا.
فرز فردي-زوجينن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1نعمنعمالتبادليمكن تشغيله بسهولة على المعالجات المتوازية.
فرز الخيوطنن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}ننعملااختيار
فرز التحديدن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1لانعماختيارحجم الكود صغير جدًا. يتميز ببساطته وقلة عدد عمليات نقل العناصر. يقوم بالضبطن-1{\displaystyle n-1}عمليات تبادل.
فرز الدورةن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}1لانعماختيارفي مكانها مع العدد الأمثل نظرياً من عمليات الكتابة.

أنواع غير مقارنة

يصف الجدول التالي خوارزميات فرز الأعداد الصحيحة وخوارزميات الفرز الأخرى التي لا تُعدّ فرزًا مقارنًا . ولا تقتصر هذه الخوارزميات على Ω ( n log n ) إلا إذا استوفت نموذج آلة الوصول العشوائي ذات التكلفة الموحدة كما هو موضح أدناه. [ 9 ]

  • تفترض التعقيدات أدناه أن يتم فرز n عنصرًا، مع مفاتيح بحجم k ، وحجم رقم d ، و r نطاق الأرقام المراد فرزها.
  • يعتمد الكثير منها على افتراض أن حجم المفتاح كبير بما يكفي بحيث يكون لجميع المدخلات قيم مفتاح فريدة، وبالتالي فإن n ≪ 2 k ، حيث تعني "أقل بكثير من".
  • في نموذج آلة الوصول العشوائي ذات التكلفة الموحدة ، الخوارزميات ذات وقت التشغيلنكد{\displaystyle n\cdot {\frac {k}{d}}}لا تزال عمليات مثل فرز الجذر تستغرق وقتًا يتناسب مع Θ( n log n ) ، لأن n محدودة بحيث لا تتجاوز2كد{\displaystyle 2^{\frac {k}{d}}}ويتطلب فرز عدد أكبر من العناصر قيمة k أكبر لتخزينها في الذاكرة. [ 10 ]
أنواع غير مقارنة
اسمأفضلمتوسطأسوأذاكرةمستقرن ≪ 2 كملحوظات
تصنيف الحمامن+2ك{\displaystyle n+2^{k}}ن+2ك{\displaystyle n+2^{k}}2ك{\displaystyle 2^{k}}نعمنعملا يمكن فرز الأعداد غير الصحيحة.
فرز الدلو (المفاتيح الموحدة)ن+ك{\displaystyle n+k}ن2ك{\displaystyle n^{2}\cdot k}نك{\displaystyle n\cdot k}نعملايفترض التوزيع المنتظم للعناصر من المجال في المصفوفة. [ 11 ]

كما لا يمكن فرز الأعداد غير الصحيحة.

فرز الدلو (مفاتيح عددية صحيحة)ن+ر{\displaystyle n+r}ن+ر{\displaystyle n+r}ن+ر{\displaystyle n+r}نعمنعمإذا كان r هويا(ن){\displaystyle O(n)}إذن ، متوسط ​​التعقيد الزمني هويا(ن){\displaystyle O(n)}[ 12 ]
فرز العدن+ر{\displaystyle n+r}ن+ر{\displaystyle n+r}ن+ر{\displaystyle n+r}نعمنعمإذا كان r هويا(ن){\displaystyle O(n)}إذن ، متوسط ​​التعقيد الزمني هويا(ن){\displaystyle O(n)}[ 11 ]
فرز جذور LSDنكد{\displaystyle n\cdot {\frac {k}{d}}}نكد{\displaystyle n\cdot {\frac {k}{d}}}نكد{\displaystyle n\cdot {\frac {k}{d}}}ن+2د{\displaystyle n+2^{d}}نعملاكد{\displaystyle {\frac {k}{d}}}مستويات التكرار، 2 د لمصفوفة العد. [ 11 ] [ 12 ]

على عكس معظم أنواع فرز التوزيع، يمكن لهذا النوع فرز الأعداد غير الصحيحة.

فرز جذور MSDن{\displaystyle n}نكد{\displaystyle n\cdot {\frac {k}{d}}}نكد{\displaystyle n\cdot {\frac {k}{d}}}ن+2د{\displaystyle n+2^{d}}نعملايستخدم الإصدار المستقر مصفوفة خارجية بحجم n لتخزين جميع الخانات.

كما هو الحال مع نوع LSD، يمكنه فرز الأعداد غير الصحيحة.

فرز الجذر MSD (في مكانه)ن{\displaystyle n}نك1{\displaystyle n\cdot {\frac {k}{1}}}نك1{\displaystyle n\cdot {\frac {k}{1}}}21{\displaystyle 2^{1}}لالاd=1 للتثبيت في المكان،ك/1{\displaystyle k/1}مستويات التكرار، بدون مصفوفة عد.
فرز التباعدننكد{\displaystyle n\cdot {\frac {k}{d}}}ن(كs+د){\displaystyle n\cdot \left({{\frac {k}{s}}+d}\right)}كد2د{\displaystyle {\frac {k}{d}}\cdot 2^{d}}لالاتعتمد الحسابات التقاربية على افتراض أن n ≪ 2 k ، لكن الخوارزمية لا تتطلب ذلك.
فاصل الانفجارنكد{\displaystyle n\cdot {\frac {k}{d}}}نكد{\displaystyle n\cdot {\frac {k}{d}}}نكد{\displaystyle n\cdot {\frac {k}{d}}}لالايتميز بمعامل ثابت أفضل من خوارزمية فرز الجذر لفرز السلاسل النصية، مع أنه يعتمد إلى حد ما على خصائص السلاسل النصية الشائعة.
فرز سريعنن+ر{\displaystyle n+r}ن2{\displaystyle n^{2}}نلالايتطلب تشغيل الخوارزمية في زمن خطي توزيعًا منتظمًا للعناصر من نطاق المصفوفة. أما إذا كان التوزيع منحرفًا بشدة، فقد يصبح الزمن تربيعيًا إذا كانت عملية الفرز الأساسية تربيعية (عادةً ما تكون فرز إدراج). النسخة المطبقة في مكانها غير مستقرة.

يمكن استخدام Samplesort لموازاة أي من عمليات الفرز غير المقارنة، من خلال توزيع البيانات بكفاءة في عدة مجموعات ثم تمرير الفرز إلى عدة معالجات، دون الحاجة إلى الدمج لأن المجموعات مرتبة بالفعل فيما بينها.

آحرون

بعض الخوارزميات بطيئة مقارنةً بتلك المذكورة أعلاه، مثل خوارزمية بوغوسورت ذات زمن التشغيل غير المحدود، وخوارزمية ستوج سورت التي يبلغ زمن تشغيلها O ( n².⁷ ). عادةً ما تُشرح هذه الخوارزميات لأغراض تعليمية لتوضيح كيفية تقدير زمن تشغيل الخوارزميات. يوضح الجدول التالي بعض خوارزميات الفرز غير العملية للاستخدام في تطبيقات البرمجيات التقليدية نظرًا لأدائها الضعيف للغاية أو متطلباتها الخاصة من الأجهزة.

اسمأفضلمتوسطأسوأذاكرةمستقرمقارنةملاحظات أخرى
فرز الخرزنSSن2{\displaystyle n^{2}}غير متوفرلايعمل فقط مع الأعداد الصحيحة الموجبة. يتطلب أجهزة متخصصة لضمان تشغيله بشكل صحيح .يا(ن){\displaystyle O(n)}الوقت . هناك إمكانية لتنفيذ البرنامج، لكن وقت التشغيل سيكون ...يا(S){\displaystyle O(S)}، حيث S هو مجموع جميع الأعداد الصحيحة المراد فرزها؛ في حالة الأعداد الصحيحة الصغيرة، يمكن اعتبارها خطية.
فرز الدمج والإدراجنسجلن{\displaystyle n\log n}المقارناتنسجلن{\displaystyle n\log n}المقارناتنسجلن{\displaystyle n\log n}المقارناتيختلفلانعميقوم بإجراء عدد قليل جدًا من المقارنات في أسوأ الحالات مقارنة بخوارزميات الفرز الأخرى.

ذات أهمية نظرية في الغالب بسبب تعقيد التنفيذ وعمليات نقل البيانات غير المثلى.

فرز السباغيتي (استطلاع الرأي)نننن2{\displaystyle n^{2}}نعماستطلاعات الرأيهذه خوارزمية تناظرية خطية الزمن لفرز سلسلة من العناصر، تتطلب مساحة تخزين O ( n ) في الذاكرة، والفرز مستقر. يتطلب ذلك n معالجًا متوازيًا. انظر فرز السباغيتي §  التحليل .
شبكة الفرزيختلفيختلفيختلفيختلفيختلف (تتطلب شبكات الفرز المستقرة المزيد من المقارنات)نعميتم تحديد ترتيب المقارنات مسبقاً بناءً على حجم شبكة ثابت.
فرز Bitonicسجل2ن{\displaystyle \log ^{2}n}موازيسجل2ن{\displaystyle \log ^{2}n}موازينسجل2ن{\displaystyle n\log ^{2}n}غير متوازٍ1لانعمشكل فعال من أشكال شبكات الفرز.
بوغوسورتن(ن×ن!){\displaystyle (n\times n!)}غير محدود1لانعمخلط عشوائي. يُستخدم لأغراض التوضيح فقط، حيث أن وقت التشغيل المتوقع في أفضل الحالات سيء للغاية. [ 13 ]

تكون أسوأ الحالات غير محدودة عند استخدام العشوائية، لكن النسخة الحتمية تضمنيا(ن×ن!){\displaystyle O(n\times n!)}أسوأ الاحتمالات.

نوع من الأتباعنسجل3/سجل1.5{\displaystyle n^{\log 3/\log 1.5}}نسجل3/سجل1.5{\displaystyle n^{\log 3/\log 1.5}}نسجل3/سجل1.5{\displaystyle n^{\log 3/\log 1.5}}سجلن{\displaystyle \log n}لانعمأبطأ من معظم خوارزميات الفرز (حتى البسيطة منها) مع تعقيد زمني قدره O ( n log 3 / log 1.5 ) = O ( n 2.7095... ) يمكن جعلها مستقرة، وهي أيضًا شبكة فرز .
فرز بطيءo(نسجل2(ن)/2){\displaystyle o\left(n^{\log _{2}(n)/2}\right)}o(نسجل2(ن)/2){\displaystyle o\left(n^{\log _{2}(n)/2}\right)}o(نسجل2(ن)/2){\displaystyle o\left(n^{\log _{2}(n)/2}\right)}نلانعمخوارزمية الضرب والاستسلام، وهي نقيض خوارزمية فرق تسد .

ابتكر علماء الحاسوب النظريون خوارزميات فرز أخرى توفر تعقيدًا زمنيًا أفضل من O ( n log n ) بافتراض قيود معينة، بما في ذلك:

  • خوارزمية ثورب، [ 14 ] هي خوارزمية فرز أعداد صحيحة عشوائية ، تستغرق وقتًا قدره O ( n log log n ) ومساحة قدرها O ( n ). [ 14 ]
  • خوارزمية AHNR، [ 15 ] خوارزمية فرز الأعداد الصحيحة التي تعمل فييا(نسجلسجلن){\displaystyle O(n\log \log n)}يتم تشغيلها بشكل حتمي، كما يوجد إصدار عشوائي يعمل في وقت خطي عندما تكون الكلمات كبيرة بما يكفي، على وجه التحديدw(سجلن)2+ε{\displaystyle w\geq (\log n)^{2+\varepsilon }}(حيث w هو حجم الكلمة).
  • خوارزمية فرز الأعداد الصحيحة العشوائية تأخذيا(نسجلسجلن){\displaystyle O\left(n{\sqrt {\log \log n}}\right)}الوقت المتوقع ومساحة O ( n ) . [ 16 ]

على الرغم من وجود عدد كبير من خوارزميات الفرز، إلا أن عددًا محدودًا منها هو السائد في التطبيقات العملية. يُستخدم فرز الإدراج على نطاق واسع مع مجموعات البيانات الصغيرة، بينما تُستخدم خوارزميات فرز فعّالة تقاربياً مع مجموعات البيانات الكبيرة، مثل فرز الكومة، وفرز الدمج، والفرز السريع. تستخدم التطبيقات الفعّالة عمومًا خوارزمية هجينة ، تجمع بين خوارزمية فعّالة تقاربياً للفرز الكلي وفرز الإدراج للقوائم الصغيرة في نهاية الاستدعاء الذاتي. أما التطبيقات عالية الأداء فتستخدم متغيرات أكثر تطورًا، مثل Timsort (فرز الدمج، وفرز الإدراج، ومنطق إضافي)، المستخدمة في Android و Java و Python ، و introsort (الفرز السريع وفرز الكومة)، المستخدمة (بأشكال مختلفة) في بعض تطبيقات الفرز في C++ وفي .NET .

بالنسبة للبيانات الأكثر تقييدًا، مثل الأرقام ضمن نطاق محدد، تُستخدم على نطاق واسع خوارزميات فرز التوزيع ، مثل فرز العد أو فرز الجذر. أما فرز الفقاعات ومشتقاته فنادرًا ما يُستخدم عمليًا، ولكنه شائع في التدريس والمناقشات النظرية.

عند فرز الأشياء المادية (مثل ترتيب الأوراق أو الاختبارات أو الكتب أبجديًا)، يستخدم الناس بشكل بديهي فرز الإدراج للمجموعات الصغيرة. أما بالنسبة للمجموعات الأكبر، فيلجأ الناس غالبًا إلى التجميع أولًا، مثلًا حسب الحرف الأول، ويتيح التجميع المتعدد فرزًا عمليًا للمجموعات الكبيرة جدًا. غالبًا ما تكون المساحة غير مكلفة نسبيًا، كما هو الحال عند نشر الأشياء على الأرض أو على مساحة واسعة، لكن العمليات مكلفة، خاصةً عند نقل شيء ما لمسافة طويلة - لذا فإن موضع المرجع مهم. يُعد فرز الدمج عمليًا أيضًا للأشياء المادية، خاصةً أنه يمكن استخدام كلتا اليدين، واحدة لكل قائمة للدمج، بينما الخوارزميات الأخرى، مثل فرز الكومة أو الفرز السريع، غير مناسبة للاستخدام البشري. كما أن خوارزميات أخرى، مثل فرز المكتبة ، وهو نوع من فرز الإدراج يترك مسافات، عملية أيضًا للاستخدام المادي.

أنواع بسيطة

يُعدّ فرز الإدراج وفرز الاختيار من أبسط أنواع الفرز، وكلاهما فعّال مع البيانات الصغيرة نظرًا لانخفاض الحمل الزائد، ولكنهما ليسا فعّالين مع البيانات الكبيرة. يُعتبر فرز الإدراج أسرع من فرز الاختيار عمليًا، نظرًا لقلة المقارنات وأدائه الجيد مع البيانات شبه المرتبة، ولذلك يُفضّل استخدامه عمليًا. أما فرز الاختيار، فيستخدم عمليات كتابة أقل، ولذلك يُستخدم عندما يكون أداء الكتابة عاملًا مُحددًا.

فرز الإدراج

فرز الإدراج هو خوارزمية فرز بسيطة وفعالة نسبيًا للقوائم الصغيرة والقوائم المرتبة في معظمها، وغالبًا ما تُستخدم كجزء من خوارزميات أكثر تعقيدًا. تعمل هذه الخوارزمية عن طريق أخذ عناصر القائمة واحدًا تلو الآخر وإدراجها في موضعها الصحيح في قائمة مرتبة جديدة، تمامًا كما يُوضع المال في المحفظة. [ 17 ] في المصفوفات، يمكن للقائمة الجديدة والعناصر المتبقية أن تتشارك مساحة المصفوفة، لكن عملية الإدراج مكلفة، إذ تتطلب إزاحة جميع العناصر التالية بمقدار عنصر واحد. فرز شيل هو نوع من فرز الإدراج أكثر كفاءة للقوائم الأكبر حجمًا.

فرز التحديد

فرز الاختيار هو فرز مقارنة موضعي . يتميز بتعقيد زمني قدره O ( ) ، مما يجعله غير فعال مع القوائم الكبيرة، وعادةً ما يكون أداؤه أسوأ من فرز الإدراج المماثل . يُعرف فرز الاختيار ببساطته، كما أنه يتمتع بمزايا أداء على الخوارزميات الأكثر تعقيدًا في بعض الحالات.

تجد الخوارزمية القيمة الدنيا، ثم تبدلها مع القيمة الموجودة في الموضع الأول، وتكرر هذه الخطوات لبقية القائمة. [ 18 ] لا تُجري الخوارزمية أكثر من n عملية تبديل، ولذلك فهي مفيدة في الحالات التي تكون فيها عملية التبديل مكلفة للغاية.

أنواع فعالة

تعتمد خوارزميات الفرز العامة العملية في الغالب على خوارزمية ذات تعقيد زمني متوسط ​​(وتعقيد زمني في أسوأ الحالات عمومًا) قدره O( n log n )، ومن أكثرها شيوعًا فرز الكومة، وفرز الدمج، والفرز السريع. لكل منها مزايا وعيوب، أبرزها أن التنفيذ البسيط لفرز الدمج يتطلب مساحة إضافية قدرها O( n )، وأن التنفيذ البسيط للفرز السريع له تعقيد زمني في أسوأ الحالات قدره O( ). يمكن حل هذه المشكلات أو التخفيف منها باستخدام خوارزمية أكثر تعقيدًا.

على الرغم من أن هذه الخوارزميات فعّالة تقاربياً على البيانات العشوائية، إلا أنه لتحقيق الكفاءة العملية على بيانات العالم الحقيقي، تُستخدم تعديلات مختلفة. أولاً، يصبح العبء الإضافي لهذه الخوارزميات كبيراً على البيانات الصغيرة، لذا غالباً ما تُستخدم خوارزمية هجينة، حيث يتم التحول عادةً إلى فرز الإدراج بمجرد أن تصبح البيانات صغيرة بما يكفي. ثانياً، غالباً ما يكون أداء الخوارزميات ضعيفاً على البيانات المرتبة مسبقاً أو شبه المرتبة - وهي بيانات شائعة في العالم الحقيقي ويمكن فرزها في زمن O( n ) باستخدام خوارزميات مناسبة. أخيراً، قد تكون هذه الخوارزميات غير مستقرة ، والاستقرار غالباً ما يكون خاصية مرغوبة في عملية الفرز. لذلك، تُستخدم خوارزميات أكثر تطوراً، مثل Timsort (المبنية على فرز الدمج) أو introsort (المبنية على الفرز السريع، مع الرجوع إلى فرز الكومة).

فرز الدمج

تستفيد خوارزمية فرز الدمج من سهولة دمج القوائم المرتبة مسبقًا في قائمة مرتبة جديدة. تبدأ بمقارنة كل عنصرين (أي 1 مع 2، ثم 3 مع 4...) وتبديلهما إذا كان يجب أن يأتي الأول بعد الثاني. ثم تدمج كل قائمة من القوائم الثنائية الناتجة في قوائم رباعية، ثم تدمج تلك القوائم الرباعية، وهكذا؛ حتى يتم دمج قائمتين في القائمة المرتبة النهائية. [ 19 ] من بين الخوارزميات الموصوفة هنا، تُعد هذه الخوارزمية الأولى التي تتناسب جيدًا مع القوائم الكبيرة جدًا، لأن زمن تشغيلها في أسوأ الحالات هو O( n log n ). كما أنها سهلة التطبيق على القوائم، وليس المصفوفات فقط، لأنها لا تتطلب سوى الوصول التسلسلي، وليس الوصول العشوائي. عند فرز المصفوفات، يكون لها تعقيد مساحة إضافي قدره O( n )، وتتضمن عددًا كبيرًا من النسخ في التطبيقات البسيطة؛ ومع ذلك، يمكن فرز القوائم المتصلة باستخدام فرز الدمج مع مساحة إضافية ثابتة، ولذلك فهي الخوارزمية المُفضلة لفرز القوائم المتصلة.

شهدت خوارزمية فرز الدمج رواجًا متزايدًا في التطبيقات العملية مؤخرًا، نظرًا لاستخدامها في خوارزمية Timsort المتطورة ، والتي تُستخدم كخوارزمية فرز قياسية في لغتي البرمجة بايثون [ 20 ] وجافا (ابتداءً من JDK7 [ 21 ] ). وتُعدّ خوارزمية فرز الدمج نفسها الخوارزمية القياسية في لغة بيرل [ 22 ] ، من بين لغات أخرى، وقد استُخدمت في جافا منذ عام 2000 على الأقل في JDK1.3 [ 23 ] .

فرز الكومة

يُعدّ فرز الكومة نسخةً أكثر كفاءةً من فرز التحديد . يعمل فرز الكومة أيضًا عن طريق تحديد أكبر (أو أصغر) عنصر في القائمة، ووضعه في نهاية (أو بداية) القائمة، ثم متابعة العملية مع باقي عناصر القائمة، ولكنه يُنجز هذه المهمة بكفاءة عالية باستخدام بنية بيانات تُسمى الكومة ، وهي نوع خاص من الأشجار الثنائية . [ 24 ] بمجرد تحويل قائمة البيانات إلى كومة، يُضمن أن تكون العقدة الجذرية هي أكبر (أو أصغر) عنصر. عند إزالتها ووضعها في نهاية القائمة، تُعاد ترتيب الكومة بحيث ينتقل أكبر عنصر متبقٍ إلى الجذر. باستخدام الكومة، يستغرق إيجاد العنصر الأكبر التالي وقتًا قدره O(log n )، بدلًا من O( n ) للمسح الخطي كما في فرز التحديد البسيط. هذا يسمح لفرز الكومة بالعمل في وقت قدره O( n log n )، وهو أيضًا أسوأ تعقيد في الحالة.

فرز سريع

خوارزمية الفرز السريع هي خوارزمية فرق تسد تعتمد على عملية تقسيم : لتقسيم مصفوفة، يتم اختيار عنصر يُسمى العنصر المحوري . [ 25 ] [ 26 ] تُنقل جميع العناصر الأصغر من العنصر المحوري قبله، وجميع العناصر الأكبر منه بعده. يمكن تنفيذ ذلك بكفاءة في وقت خطي وفي مكانها . ثم تُفرز القوائم الفرعية الأصغر والأكبر بشكل متكرر. ينتج عن ذلك تعقيد زمني متوسط ​​قدره O( n log n )، مع تكلفة إضافية منخفضة، ولذلك فهي خوارزمية شائعة. عادةً ما تكون التطبيقات الفعالة للفرز السريع (مع التقسيم في مكانه) خوارزميات فرز غير مستقرة ومعقدة نوعًا ما، ولكنها من بين أسرع خوارزميات الفرز عمليًا. إلى جانب استخدامها المتواضع للمساحة O(log n )، تُعد خوارزمية الفرز السريع واحدة من أكثر خوارزميات الفرز شيوعًا، وهي متوفرة في العديد من مكتبات البرمجة القياسية.

يكمن التحذير المهم بشأن خوارزمية الفرز السريع في أن أسوأ أداء لها هو O( )؛ ورغم ندرة هذا، إلا أنه يحدث في التطبيقات البسيطة (باختيار العنصر الأول أو الأخير كعنصر محوري) للبيانات المرتبة، وهو أمر شائع. لذا، فإن أكثر المسائل تعقيدًا في خوارزمية الفرز السريع هي اختيار عنصر محوري مناسب، إذ أن الاختيارات السيئة باستمرار للعناصر المحورية قد تؤدي إلى أداء أبطأ بكثير O( ) ، بينما يؤدي الاختيار الجيد للعناصر المحورية إلى أداء O( n log n )، وهو الأداء الأمثل تقاربًا. على سبيل المثال، إذا تم اختيار الوسيط كعنصر محوري في كل خطوة، فإن الخوارزمية تعمل في O( n log n ). مع ذلك، فإن إيجاد الوسيط، كما هو الحال في خوارزمية اختيار وسيط الوسائط، هو عملية O( n ) على القوائم غير المرتبة، وبالتالي يتطلب جهدًا إضافيًا كبيرًا مع عملية الفرز. عمليًا، من شبه المؤكد أن اختيار عنصر محوري عشوائي سيؤدي إلى أداء O( n log n ).    

إذا كان ضمان أداء من رتبة O( n log n ) مهمًا، فهناك تعديل بسيط لتحقيق ذلك. الفكرة، التي تعود إلى موسر، هي وضع حد أقصى لعمق الاستدعاء الذاتي. [ 27 ] إذا تم تجاوز هذا الحد، يستمر الفرز باستخدام خوارزمية فرز الكومة. اقترح موسر أن يكون الحد1+2سجل2(ن){\displaystyle 1+2\lfloor \log _{2}(n)\rfloor }، وهو ما يعادل تقريبًا ضعف الحد الأقصى لعمق التكرار الذي يمكن للمرء أن يتوقعه في المتوسط ​​مع مصفوفة مرتبة عشوائيًا .

شلسورت

تختلف خوارزمية شل سورت عن خوارزمية الفقاعات في أنها تنقل العناصر إلى العديد من مواقع التبديل.

ابتكر دونالد شيل خوارزمية فرز شيل عام 1959. [ 28 ] وهي تُحسّن من فرز الإدراج عن طريق تحريك العناصر غير المرتبة أكثر من موضع واحد في كل مرة. ويكمن المفهوم وراء فرز شيل في أن فرز الإدراج يعمل فييا(كن){\displaystyle O(kn)}في زمن O (n²)، حيث k هي أكبر مسافة بين عنصرين غير مرتبين. هذا يعني أن أداء هذه الخوارزمية يكون عادةً O( ) ، ولكن بالنسبة للبيانات المرتبة في معظمها، والتي تحتوي على عدد قليل فقط من العناصر غير المرتبة، يكون الأداء أسرع. لذا، من خلال فرز العناصر البعيدة أولاً، ثم تقليص المسافة بينها تدريجياً، تتم عملية الفرز النهائية بسرعة أكبر بكثير. يمكن وصف إحدى طرق التنفيذ بترتيب تسلسل البيانات في مصفوفة ثنائية الأبعاد، ثم فرز أعمدة المصفوفة باستخدام فرز الإدراج.

يُعدّ تعقيد الوقت في أسوأ الحالات لخوارزمية Shellsort مسألة مفتوحة ، ويعتمد على تسلسل الفجوات المستخدم، حيث تتراوح التعقيدات المعروفة من O ( ) إلى O ( n⁴ ) وΘ( n log₂n ) . هذا، بالإضافة إلى كون Shellsort خوارزميةً تُنفّذ في مكانها ، ولا تتطلب سوى قدر ضئيل نسبيًا من التعليمات البرمجية، ولا تستلزم استخدام مكدس الاستدعاءات ، يجعلها مفيدةً في الحالات التي تكون فيها الذاكرة محدودة، كما هو الحال في الأنظمة المدمجة ونواة أنظمة التشغيل .

فرز الفقاعات وأنواعه

تُعدّ خوارزميات فرز الفقاعات، ومشتقاتها مثل فرز المشط وفرز الكوكتيل ، خوارزميات فرز بسيطة وغير فعّالة للغاية. كثيراً ما تُذكر في الكتب التمهيدية لسهولة تحليلها، ولكن نادراً ما تُستخدم عملياً.

فرز الفقاعات

فرز الفقاعات، خوارزمية فرز تتنقل باستمرار عبر قائمة، وتبدل العناصر حتى تظهر بالترتيب الصحيح

فرز الفقاعات خوارزمية فرز بسيطة. تبدأ الخوارزمية من بداية مجموعة البيانات، حيث تقارن أول عنصرين، وإذا كان الأول أكبر من الثاني، فإنها تبدلهما. وتستمر في فعل ذلك لكل زوج من العناصر المتجاورة حتى نهاية مجموعة البيانات. ثم تبدأ من جديد مع أول عنصرين، وتكرر العملية حتى لا يحدث أي تبديل في الدورة الأخيرة. [ 29 ] يبلغ متوسط ​​وقت هذه الخوارزمية وأداؤها في أسوأ الحالات O( ) ، لذا نادرًا ما تُستخدم لفرز مجموعات البيانات الكبيرة غير المرتبة. يمكن استخدام فرز الفقاعات لفرز عدد قليل من العناصر (حيث لا يمثل عدم كفاءتها التقاربية عيبًا كبيرًا). كما يمكن استخدامها بكفاءة على قائمة بأي طول مرتبة تقريبًا (أي أن العناصر ليست خارجة عن ترتيبها بشكل ملحوظ). على سبيل المثال، إذا كان أي عدد من العناصر خارج مكانه بمقدار موضع واحد فقط (مثل 0123546789 و 1032547698)، فإن عملية التبادل في فرز الفقاعات ستجعلها مرتبة في المرور الأول، وسيجد المرور الثاني جميع العناصر بالترتيب، لذلك سيستغرق الفرز 2n مرة فقط .

فرز المشط

فرز المشط هو خوارزمية فرز بسيطة نسبيًا تعتمد على فرز الفقاعات ، وقد صممها في الأصل فلودزيميرز دوبوسيفيتش عام 1980. [ 30 ] أُعيد اكتشافها ونشرها لاحقًا على يد ستيفن لاسي وريتشارد بوكس ​​من خلال مقال نُشر في مجلة بايت في أبريل 1991. تتلخص الفكرة الأساسية في التخلص من "السلاحف "، أو القيم الصغيرة القريبة من نهاية القائمة، لأنها تُبطئ عملية الفرز بشكل كبير في فرز الفقاعات. (أما " الأرانب" ، وهي القيم الكبيرة في بداية القائمة، فلا تُشكل مشكلة في فرز الفقاعات). يُحقق فرز المشط ذلك عن طريق تبديل العناصر التي تفصل بينها مسافة معينة في المصفوفة، بدلًا من تبديل العناصر المتجاورة فقط، ثم تقليص المسافة المختارة تدريجيًا حتى يعمل كفرز فقاعات عادي. وبالتالي، إذا كان فرز شيل يُعتبر نسخة مُعممة من فرز الإدراج تُبدل العناصر المتباعدة بمسافة معينة، فإن فرز المشط يُمكن اعتباره نفس التعميم مُطبقًا على فرز الفقاعات.

فرز التوزيع

يشير فرز التوزيع إلى أي خوارزمية فرز يتم فيها توزيع البيانات من مدخلاتها إلى عدة هياكل وسيطة، ثم تُجمع هذه الهياكل وتُوضع في المخرجات. على سبيل المثال، يُعد كل من فرز الدلو وفرز الفلاش من خوارزميات الفرز القائمة على التوزيع. يمكن استخدام خوارزميات فرز التوزيع على معالج واحد، أو يمكن أن تكون خوارزمية موزعة ، حيث تُفرز مجموعات فرعية منفصلة على معالجات مختلفة، ثم تُدمج. يتيح ذلك فرز البيانات الكبيرة جدًا بحيث لا تتسع لها ذاكرة حاسوب واحد.

فرز العد

يُستخدم فرز العد عندما يكون كل مُدخل معروفًا بانتمائه إلى مجموعة مُحددة، S ، من الاحتمالات. يعمل هذا الخوارزمية في زمن O(| S | + n ) وذاكرة O(| S |)، حيث n هو طول المُدخل. تعتمد الخوارزمية على إنشاء مصفوفة أعداد صحيحة بحجم | S |، واستخدام الخانة i لحساب عدد مرات ظهور العنصر i من S في المُدخل. ثم يتم حساب كل مُدخل بزيادة قيمة الخانة المُقابلة له. بعد ذلك، يتم المرور على مصفوفة العد لترتيب جميع المُدخلات. غالبًا ما يتعذر استخدام خوارزمية الفرز هذه لأن S يجب أن تكون صغيرة نسبيًا لكي تكون الخوارزمية فعالة، ولكنها سريعة للغاية وتُظهر أداءً تقاربيًا ممتازًا مع زيادة n . كما يُمكن تعديلها لتوفير أداء مستقر.

فرز الدلو

فرز الدلو هو خوارزمية فرز تعتمد على أسلوب فرق تسد، وهي تعميم لخوارزمية فرز العد، حيث يتم تقسيم المصفوفة إلى عدد محدود من الدلو. ثم يتم فرز كل دلو على حدة، إما باستخدام خوارزمية فرز مختلفة أو بتطبيق خوارزمية فرز الدلو بشكل متكرر.

يعمل فرز الدلو بشكل أفضل عندما يتم توزيع عناصر مجموعة البيانات بالتساوي عبر جميع الدلو.

فرز الجذر

فرز الجذر هو خوارزمية لفرز الأرقام بمعالجة كل رقم على حدة. يتم فرز n عددًا، كل منها يتكون من k رقمًا، في زمن قدره O( n · k ). يمكن لفرز الجذر معالجة أرقام كل عدد إما بدءًا من الرقم الأقل أهمية (LSD) أو بدءًا من الرقم الأكثر أهمية (MSD). تقوم خوارزمية LSD أولًا بفرز القائمة حسب الرقم الأقل أهمية مع الحفاظ على ترتيبها النسبي باستخدام فرز مستقر. ثم تقوم بفرزها حسب الرقم التالي، وهكذا من الأقل أهمية إلى الأكثر أهمية، حتى تحصل في النهاية على قائمة مرتبة. بينما يتطلب فرز الجذر LSD استخدام فرز مستقر، فإن خوارزمية فرز الجذر MSD لا تتطلب ذلك (إلا إذا كان الفرز المستقر مطلوبًا). فرز الجذر MSD الموضعي غير مستقر. من الشائع استخدام خوارزمية فرز العد داخليًا في فرز الجذر. يُحسّن أسلوب الفرز الهجين ، مثل استخدام فرز الإدراج للمجموعات الصغيرة، أداء فرز الجذر بشكل ملحوظ.

يقدم نيكلاوس ويرث في كتابه "الخوارزميات وهياكل البيانات" مقارنة بين أوقات تشغيل العديد من الخوارزميات الشائعة على حاسوب ليليث . [ 31 ]

فرز 2048 عنصرًا عشوائيًا
الخوارزميةالوقت (بالثواني)
فرز الفقاعات128.84
نوع شاكر104.44
فرز التحديد58.34
فرز الإدراج50.74
فرز الإدراج الثنائي37.66
فرز الصدف7.08
فرز الكومة2.22
فرز الدمج2.06
فرز سريع غير تكراري1.32
فرز سريع متكرر1.22

أنماط استخدام الذاكرة وفرز الفهارس

عندما يقترب حجم المصفوفة المراد فرزها من الذاكرة الرئيسية المتاحة أو يتجاوزها، مما يستدعي استخدام مساحة القرص أو مساحة التبديل (الأبطأ بكثير)، يصبح نمط استخدام الذاكرة لخوارزمية الفرز بالغ الأهمية، وقد تصبح الخوارزمية التي كانت فعّالة نسبيًا عندما كانت المصفوفة تتسع بسهولة في ذاكرة الوصول العشوائي (RAM) غير عملية. في هذه الحالة، يصبح العدد الإجمالي للمقارنات أقل أهمية (نسبيًا)، وقد يهيمن عدد مرات نسخ أجزاء الذاكرة أو تبديلها من وإلى القرص على خصائص أداء الخوارزمية. وبالتالي، قد يكون عدد مرات المرور وموقع المقارنات أكثر أهمية من العدد الإجمالي للمقارنات، نظرًا لأن مقارنات العناصر المتجاورة تتم بسرعة ناقل النظام (أو حتى بسرعة وحدة المعالجة المركزية مع التخزين المؤقت )، وهي سرعة شبه فورية مقارنة بسرعة القرص.

على سبيل المثال، تُقدّم خوارزمية الفرز السريع التكرارية الشائعة أداءً مقبولاً مع ذاكرة وصول عشوائي كافية، ولكن نظرًا لطريقة نسخها التكرارية لأجزاء المصفوفة، تصبح أقل عمليةً عندما لا تتسع المصفوفة في ذاكرة الوصول العشوائي، لأنها قد تتسبب في عدد من عمليات النسخ أو النقل البطيئة من وإلى القرص. في هذه الحالة، قد تكون خوارزمية أخرى أفضل حتى لو تطلبت عددًا أكبر من المقارنات الإجمالية.

إحدى طرق التغلب على هذه المشكلة، والتي تُجدي نفعًا عند فرز السجلات المعقدة (كما هو الحال في قواعد البيانات العلائقية ) باستخدام حقل مفتاح صغير نسبيًا، هي إنشاء فهرس في المصفوفة ثم فرز الفهرس، بدلًا من فرز المصفوفة بأكملها. (يمكن حينها إنتاج نسخة مُفرزة من المصفوفة بأكملها بقراءة واحدة من الفهرس، ولكن غالبًا ما يكون ذلك غير ضروري، إذ يكفي وجود الفهرس المُفرز). ولأن الفهرس أصغر بكثير من المصفوفة بأكملها، فإنه قد يتسع بسهولة في الذاكرة حيث لا تتسع المصفوفة بأكملها، مما يُزيل فعليًا مشكلة تبديل القرص. تُسمى هذه العملية أحيانًا "فرز الوسوم". [ 32 ]

من التقنيات الأخرى للتغلب على مشكلة حجم الذاكرة استخدام الفرز الخارجي ، فعلى سبيل المثال، تتمثل إحدى الطرق في دمج خوارزميتين بطريقة تستفيد من نقاط قوة كل منهما لتحسين الأداء العام. فعلى سبيل المثال، يمكن تقسيم المصفوفة إلى أجزاء بحجم يتناسب مع ذاكرة الوصول العشوائي (RAM)، ثم فرز محتويات كل جزء باستخدام خوارزمية فعالة (مثل الفرز السريع )، ودمج النتائج باستخدام دمج متعدد الاتجاهات (k -way merge merge) مشابه للدمج المستخدم في فرز الدمج . هذه الطريقة أسرع من تطبيق فرز الدمج أو الفرز السريع على القائمة بأكملها. [ 33 ] [ 34 ]

يمكن أيضًا دمج التقنيات. عند فرز مجموعات بيانات ضخمة جدًا تتجاوز ذاكرة النظام بشكل كبير، قد يلزم فرز الفهرس باستخدام خوارزمية أو مجموعة من الخوارزميات المصممة للعمل بكفاءة مع الذاكرة الافتراضية ، أي لتقليل مقدار التبديل المطلوب.

تشمل المشكلات ذات الصلة الفرز التقريبي (فرز سلسلة ضمن نطاق معين من الترتيب الصحيح)، والفرز الجزئي (فرز أصغر k عنصر فقط من قائمة، أو إيجاد أصغر k عنصر، ولكن بدون ترتيب)، والاختيار (حساب أصغر عنصر k ). يمكن حل هذه المشكلات بشكل غير فعال باستخدام الفرز الكلي، ولكن توجد خوارزميات أكثر كفاءة، غالبًا ما تُشتق من تعميم خوارزمية فرز. المثال الأبرز هو الاختيار السريع ، المرتبط بالفرز السريع . في المقابل، يمكن اشتقاق بعض خوارزميات الفرز من خلال التطبيق المتكرر لخوارزمية اختيار؛ يمكن اعتبار الفرز السريع والاختيار السريع بمثابة نفس حركة التمحور، مع اختلاف فقط في ما إذا كان أحدهما يتكرر على كلا الجانبين (الفرز السريع، فرق تسد ) أو على جانب واحد (الاختيار السريع، التناقص والتغلب ).

تُعتبر خوارزمية الخلط نقيضًا لخوارزمية الفرز. يختلف هذان النوعان اختلافًا جوهريًا لأنهما يتطلبان مصدرًا للأرقام العشوائية. يمكن أيضًا تنفيذ الخلط باستخدام خوارزمية فرز، وتحديدًا عن طريق الفرز العشوائي: حيث يتم تعيين رقم عشوائي لكل عنصر من عناصر القائمة، ثم الفرز بناءً على هذه الأرقام العشوائية. مع ذلك، لا يُستخدم هذا الأسلوب عمليًا في الغالب، وهناك خوارزمية خلط بسيطة وفعّالة ومعروفة جيدًا: خلط فيشر-ياتس .

تُعدّ خوارزميات الفرز غير فعّالة في إيجاد ترتيب في كثير من الحالات. عادةً، عندما تفتقر العناصر إلى دالة مقارنة موثوقة (كما في أنظمة التصويت التي تعتمد على تفضيلات الجمهور )، أو عندما تكون المقارنات مكلفة للغاية ( كما في الرياضة )، أو عندما يستحيل إجراء مقارنة ثنائية بين جميع العناصر وفقًا لجميع المعايير (كما في محركات البحث ). في هذه الحالات، يُشار إلى المشكلة عادةً باسم "التصنيف" ، والهدف هو إيجاد النتيجة "الأفضل" لبعض المعايير بناءً على الاحتمالات المستنتجة من المقارنات أو التصنيفات. ومن الأمثلة الشائعة على ذلك لعبة الشطرنج، حيث يُصنّف اللاعبون باستخدام نظام تصنيف إيلو ، ويتم تحديد التصنيفات من خلال نظام البطولات بدلاً من خوارزمية الفرز.

توجد خوارزميات فرز للمقارن "الضوضائي" (الذي قد يكون غير صحيح)، وخوارزميات فرز لزوج من المقارنات "السريعة وغير الدقيقة" (أي "الضوضائية") و"الدقيقة". قد يكون هذا مفيدًا عندما تكون دالة المقارنة الكاملة مكلفة. [ 35 ]

انظر أيضاً

مراجع

  1. "تعرّف على 'سيدات الثلاجة' اللواتي برمجن جهاز إينياك" . مينتال فلوس . ١٣ أكتوبر ٢٠١٣. مؤرشف من الأصل في ٨ أكتوبر ٢٠١٨. تم الاطلاع عليه في ١٦ يونيو ٢٠١٦ .
  2. لور، ستيف (17 ديسمبر 2001). "فرانسيس إي. هولبرتون، 84 عامًا، من أوائل مبرمجي الحاسوب" . نيويورك تايمز. مؤرشف من الأصل في 16 ديسمبر 2014. تم الاطلاع عليه في 16 ديسمبر 2014 .
  3. ديموث، هوارد ب. (1956). فرز البيانات الإلكترونية (أطروحة دكتوراه). جامعة ستانفورد. بروكويست 301940891 . 
  4. ^ كورمين، توماس هـ . ليسرسون، تشارلز إي . ريفست، رونالد ل . Stein، Clifford (2009)، “8”، مقدمة للخوارزميات ( الطبعة الثالثة)، Cambridge، MA: The MIT Press، p. 167، ردمك   978-0-262-03293-3
  5. أجتاي، مكوملوس، جسزيميريدي، إ. (1983). شبكة فرز من رتبة O(n log n) . STOC '83. وقائع الندوة السنوية الخامسة عشرة لجمعية ACM حول نظرية الحوسبة . الصفحات 1-9 . doi : 10.1145/800061.808726 . ISBN  0-89791-099-0.
  6. كيم، ب.س.؛ كوتزنر، أ. (2008). دمج مستقر قائم على النسبة في مكانه . TAMC 2008. نظرية وتطبيقات نماذج الحوسبة . LNCS . المجلد 4978. الصفحات 246-257 . CiteSeerX 10.1.1.330.2641 . doi : 10.1007/978-3-540-79228-4_22 . ISBN    978-3-540-79227-7.
  7. سيدجويك، روبرت (1 سبتمبر 1998). الخوارزميات في لغة سي: الأساسيات، هياكل البيانات، الفرز، البحث، الأجزاء 1-4 ( الطبعة الثالثة). بيرسون للتعليم. ISBN  978-81-317-1291-7تم الاطلاع عليه بتاريخ 27 نوفمبر 2012 .
  8. سيدجويك، ر. (1978). "تنفيذ برامج الفرز السريع". مجلة الاتصالات ACM . 21 (10): 847-857 . doi : 10.1145/359619.359631 . S2CID 10020756 . 
  9. كورمن، توماس هـليسرسون، تشارلز إيريفست، رونالد لشتاين، كليفورد (2001)، "8"، مقدمة في الخوارزميات ( الطبعة الثانية)، كامبريدج، ماساتشوستس: مطبعة معهد ماساتشوستس للتكنولوجيا، ص 165، ISBN   0-262-03293-7
  10. نيلسون، ستيفان (2000). "أسرع خوارزمية فرز؟" . دكتور دوبس . مؤرشف من الأصل بتاريخ 2019-06-08 . تم الاطلاع عليه بتاريخ 2015-11-23 .
  11. 1 2 3 كورمن، توماس هـليسرسون، تشارلز إيريفست، رونالد لشتاين، كليفورد (2001) [1990]. مقدمة في الخوارزميات ( الطبعة الثانية). مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل. ISBN  0-262-03293-7.
  12. 1 2 جودريتش، مايكل تتاماسيا، روبرتو (2002). "4.5 فرز الدلو وفرز الجذر". تصميم الخوارزميات: الأسس والتحليل وأمثلة الإنترنت . جون وايلي وأولاده. ص 241-243 . ISBN  978-0-471-38365-9.
  13. غروبر، هـ.؛ هولزر، م.؛ روب، أ. (2007)، "الفرز بالطريقة البطيئة: تحليل لخوارزميات الفرز العشوائي السيئة بشكل غريب"، المؤتمر الدولي الرابع حول متعة الخوارزميات، كاستيغليونشيلو، إيطاليا، 2007 (ملف PDF) ، سلسلة محاضرات في علوم الحاسوب، المجلد 4475، سبرينغر-فيرلاغ، الصفحات 183-197 ، doi : 10.1007/978-3-540-72914-3_17 ، ISBN   978-3-540-72913-6تمت أرشفة الملف (PDF) من النسخة الأصلية بتاريخ 29 سبتمبر 2020 ، وتم استرجاعه بتاريخ 27 يونيو 2020.
  14. ثورب ، م. (فبراير 2002). "الفرز العشوائي في زمن O(n log log n) ومساحة خطية باستخدام الجمع والإزاحة والعمليات المنطقية الثنائية". مجلة الخوارزميات . 42 (2): 205-230 . doi : 10.1006/jagm.2002.1211 . S2CID 9700543 . 
  15. أندرسون، آرني؛ هاجيروب، توربن؛ نيلسون، ستيفان؛ رامان، راجيف (1995). "الفرز في زمن خطي؟". وقائع الندوة السنوية السابعة والعشرين لجمعية آلات الحوسبة حول نظرية الحوسبة . جمعية آلات الحوسبة. الصفحات 427-436 . 
  16. هان، ييجي؛ ثورب، م. (2002). فرز الأعداد الصحيحة في زمن متوقع O(n√(log log n)) ومساحة خطية . المؤتمر السنوي الثالث والأربعون لمؤسسة IEEE حول أسس علوم الحاسوب . الصفحات 135-144 . doi : 10.1109/SFCS.2002.1181890 . ISBN  0-7695-1822-2.
  17. ويرث، نيكلاوس (1986). الخوارزميات وهياكل البيانات . أبر سادل ريفر، نيوجيرسي: برنتيس هول. الصفحات 76-77 . ISBN  978-0130220059.
  18. ويرث 1986 ، الصفحات 79-80 
  19. ويرث 1986 ، الصفحات 101-102 
  20. «الوصف الأصلي لـ timsort من تيم بيترز» . python.org . مؤرشف من الأصل بتاريخ 22 يناير 2018. تم الاطلاع عليه بتاريخ 14 أبريل 2018 .
  21. "OpenJDK's TimSort.java" . java.net . مؤرشف من الأصل بتاريخ 14 أغسطس 2011. تم الاطلاع عليه بتاريخ 14 أبريل 2018 .
  22. "sort – perldoc.perl.org" . perldoc.perl.org . مؤرشف من الأصل بتاريخ 14 أبريل 2018. تم الاطلاع عليه بتاريخ 14 أبريل 2018 .
  23. فرز الدمج في جافا 1.3 ، صن. مؤرشف في 4 مارس 2009 على موقع Wayback Machine
  24. ويرث 1986 ، الصفحات 87-89 
  25. ويرث 1986 ، ص 93 
  26. ^ كورمين، توماس هـ . ليسرسون، تشارلز إي . ريفست، رونالد ل . Stein، Clifford (2009)، مقدمة للخوارزميات ( الطبعة الثالثة)، Cambridge، MA: The MIT Press، pp. 171– 172، ISBN   978-0262033848
  27. موسر، ديفيد ر. (1997)، "خوارزميات الفرز والاختيار الاستبطانية"، البرمجيات: الممارسة والخبرة ، 27 (8): 983-993 ، doi : 10.1002/(SICI)1097-024X(199708)27:8 < 983::AID-SPE117 > 3.0.CO ; 2-#
  28. شيل، د. ل. (1959). "إجراء فرز عالي السرعة" (ملف PDF) . اتصالات رابطة آلات الحوسبة . 2 (7): 30-32 . doi : 10.1145/368370.368387 . S2CID 28572656. مؤرشف من الأصل (ملف PDF) بتاريخ 30 أغسطس 2017. تم الاطلاع عليه بتاريخ 23 مارس 2020 . 
  29. ويرث 1986 ، الصفحات 81-82 
  30. بريجوفا، ب. (15 سبتمبر 2001). "تحليل متغيرات خوارزمية Shellsort". رسائل معالجة المعلومات 79 (5): 223-227 . doi : 10.1016/S0020-0190(00)00223-4 .
  31. ويرث 1986 ، ص 100.
  32. "تعريف فرز العلامات من موسوعة مجلة الكمبيوتر الشخصي" . Pcmag.com . مؤرشف من الأصل في 6 أكتوبر 2012. تم الاطلاع عليه في 14 أبريل 2018 .
  33. دونالد كنوث ، فن برمجة الحاسوب ، المجلد 3: الفرز والبحث ، الطبعة الثانية. أديسون-ويسلي، 1998، رقم ISBN 0-201-89685-0، القسم 5.4: الفرز الخارجي، الصفحات 248-379.
  34. إليس هورويتز وسارتاج ساهني ، أساسيات هياكل البيانات ، إتش. فريمان وشركاه، رقم ISBN 0-7167-8042-9.
  35. باي، شينغجيان؛ كويستر، كريستيان (2023). الفرز باستخدام التنبؤات . NeurIPS. ص 5. 

للمزيد من القراءة