0Pricing
Go Academy · درس

الفرز المستقر

حافظ على ترتيب العناصر المتساوية

الفرز المستقر درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

ما هو الفرز المستقر

يحافظ الفرز المستقر على الترتيب النسبي الأصلي للعناصر المتساوية. فإذا تساوى سجلان وفق المقارنة، يبقى السجل الذي ظهر أولًا في المقدمة.

أهمية ذلك

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

sort.Slice غير مستقر

لا يضمن sort.Slice العادي الاستقرار. فقد يُعاد ترتيب العناصر المتساوية. ولضمان الاستقرار، استخدموا sort.SliceStable.

sort.SliceStable

يمتلك sort.SliceStable التوقيع نفسه الموجود في sort.Slice، لكنه يحافظ على ترتيب العناصر المتساوية.

package main

import (
	"fmt"
	"sort"
)

func main() {
	nums := []int{3, 1, 2, 1}
	sort.SliceStable(nums, func(i, j int) bool {
		return nums[i] < nums[j]
	})
	fmt.Println(nums)
}

رؤية الاستقرار مع البنى

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

package main

import (
	"fmt"
	"sort"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	p := []Person{{"Ann", 30}, {"Bob", 25}, {"Cara", 30}}
	sort.SliceStable(p, func(i, j int) bool {
		return p[i].Age < p[j].Age
	})
	fmt.Println(p)
}

آن قبل كارا

في المثال السابق، كان عمر Ann وCara يساوي 30. وبما أن Ann ظهرت أولًا في الإدخال، يحافظ الفرز المستقر على ظهور Ann قبل Cara في النتيجة.

الفرز على مراحل متعددة

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

package main

import (
	"fmt"
	"sort"
)

type Rec struct {
	City string
	Name string
}

func main() {
	r := []Rec{{"Rome", "Zoe"}, {"Oslo", "Ann"}, {"Rome", "Ann"}}
	sort.SliceStable(r, func(i, j int) bool { return r[i].Name < r[j].Name })
	sort.SliceStable(r, func(i, j int) bool { return r[i].City < r[j].City })
	fmt.Println(r)
}

sort.Stable

بالنسبة إلى الأنواع التي تنفّذ sort.Interface، استخدموا sort.Stable بدلًا من sort.Sort للحصول على الاستقرار.

package main

import (
	"fmt"
	"sort"
)

type ByLen []string

func (s ByLen) Len() int           { return len(s) }
func (s ByLen) Less(i, j int) bool { return len(s[i]) < len(s[j]) }
func (s ByLen) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }

func main() {
	w := []string{"bb", "cc", "a"}
	sort.Stable(ByLen(w))
	fmt.Println(w)
}

تكلفة الاستقرار

قد تستخدم عمليات الفرز المستقرة قدرًا أكبر قليلًا من الذاكرة أو الوقت مقارنة بعمليات الفرز غير المستقرة. وإذا لم تكونوا بحاجة إلى الحفاظ على ترتيب العناصر المتساوية، فإن sort.Slice العادي مناسب.

متى تختارون الفرز المستقر

اختر الفرز المستقر عندما:

  • يكون للعناصر ترتيب أصلي ذو معنى
  • تفرز على عدة مراحل باستخدام مفاتيح مختلفة
  • يجب ألا يتغير ترتيب العناصر المتساوية

مثال على التحقق من الفرز المستقر

يظهر عنصران لهما مفاتيح فرز متساوية في ترتيب الإدخال، أولًا A ثم B. يضمن الفرز المستقر أن يحافظ الناتج على ترتيب A قبل B.

package main

import (
	"fmt"
	"sort"
)

func main() {
	type T struct{ Key, Tag int }
	ts := []T{{1, 100}, {1, 200}, {0, 300}}
	sort.SliceStable(ts, func(i, j int) bool { return ts[i].Key < ts[j].Key })
	fmt.Println(ts)
}

تحقق سريع

تفرز سجلات حسب المدينة باستخدام sort.SliceStable. توجد سجلات لمدينتين متماثلتين. ما الذي يضمنه ذلك؟

مراجعة

يحافظ الفرز المستقر على ترتيب العناصر المتساوية:

  • sort.SliceStable للمقاطع
  • sort.Stable لأنواع sort.Interface
  • يتيح الفرز على مراحل متعددة باستخدام مفاتيح مختلفة

الأسئلة الشائعة

هل درس «الفرز المستقر» مجاني؟

نعم — نص درس «الفرز المستقر» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «الفرز المستقر»؟

حافظ على ترتيب العناصر المتساوية تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الفرز المستقر»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ترتيب الشرائح
  2. ترتيبات فرز مخصّصة
  3. البحث في البيانات المرتّبة
  4. الفرز المستقر
← العودة إلى Go Academy