إليك خوارزمية الفرز لاستخدامها مع مجموعة من الأعداد الصحيحة أو الهياكل التي يتم ربطها بواسطة عدد صحيح. مفيد بشكل خاص عندما يكون نطاق الأعداد الصحيحة متناسبًا مع حجم الإدخال.
الفكرة الرئيسية هي تحديد تكرار حدوث الأعداد الصحيحة واستخدام ذلك لتحديد الترتيب المفرز.
مثال: لنفترض أننا حصلنا على المصفوفة {1,3,1,2}.
قم أولاً بتحديد نطاق الأعداد الصحيحة، الحد الأقصى والحد الأدنى، 1 و3 لهذا الإدخال.
بعد ذلك قم بإنشاء مصفوفة، أطلق عليها اسم مصفوفة الأعداد، أي حجم النطاق الصحيح 1، لذلك 3 (3-1 1) في هذه الحالة.
قم بالتكرار عبر مصفوفة الإدخال، مع زيادة الإدخال المناسب في الأعداد. سيتم وضع عدد قيمة الإدخال المحددة في counts[value - min]. بالنسبة للإدخال المحدد، فإن الأعداد[0] ستحتفظ بعدد القيمة 1.
ينتج عن هذا مصفوفة الأعداد: {2,1,1}
الآن حدد الأعداد التراكمية، والتي هي في الأساس counts[i] = counts[i-1] counts[i].
ينتج عن هذا مصفوفة الأعداد التراكمية: {2,3,4}
إنشاء مصفوفة إخراج للمدخلات التي تم فرزها.
الآن، قم بالتكرار على الإدخال بترتيب عكسي.
في كل خطوة، قم باسترداد العدد التراكمي للقيمة الموجودة في صفيف الإدخال. سيتم وضع القيمة في فهرس صفيف الإخراج المطابق للعدد المسترد - 1. ثم قم بتخفيض قيمة العدد التراكمي.
في الخطوة الأولى، يتم استرداد القيمة 2 والعدد التراكمي 3. يجب وضع القيمة في الفهرس 2 (3-1) في الإخراج.
في التكرار التالي، القيمة 1 والعدد التراكمي 2؛ لذلك يتم وضع هذا "1" في الفهرس 1 (2-1) من الإخراج.
استمرار القيمة 3 والعدد التراكمي 4؛ وضعه في الفهرس 3 من الإخراج.
أخيرًا، القيمة 1 للمرة الثانية والعدد التراكمي 1 (نظرًا لأن العدد قد انخفض في المرة الأولى التي شوهد فيها)؛ لذلك يتم وضع هذا "1" في الفهرس 0 للإخراج.
، انظر كيف يحافظ التكرار في الاتجاه المعاكس على ترتيب العناصر المتساوية مما يجعل الفرز "مستقرًا"
المصفوفة المصنفة الناتجة هي {1,1,2,3}
func CountingSort(in []int) []int { // find the min/max values min := slices.Min(in) max := slices.Max(in) // create the count array counts := make([]int, max-min 1) for _, v := range in { counts[v-min] } // determine cumulative counts for i := 1; iهل يمكن جعلها أكثر كفاءة؟ اترك تعليقاتك واقتراحاتك أدناه.
شكرًا!
يمكن العثور على رمز هذه المشاركة وجميع المشاركات في هذه السلسلة هنا
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3