ترتيب الاختيار
ترتيب الاختيار (selection sort) بسيط جداً في عمله: في كل جولة يختار أصغر عنصر من المجال غير المرتب ويضعه في نهاية المجال المرتب.
افترض أن طول المصفوفة . ويوضح الشكل أدناه سير ترتيب الاختيار.
- في البداية تكون جميع العناصر غير مرتبة، أي إن مجال الفهارس غير المرتب هو .
- اختر أصغر عنصر في المجال وبدّله مع العنصر عند الفهرس . وبعد الانتهاء يصبح العنصر الأول من المصفوفة مرتباً.
- اختر أصغر عنصر في المجال وبدّله مع العنصر عند الفهرس . وبعد الانتهاء يصبح العنصران الأولان من المصفوفة مرتبين.
- وهكذا دواليك. بعد جولة من الاختيار والتبديل، تصبح العناصر الأولى من المصفوفة مرتبة.
- ولا بد أن يكون العنصر الوحيد المتبقي هو الأكبر، لذا لا حاجة إلى مزيد من الترتيب وتصبح المصفوفة مرتبة.
في الشيفرة نستخدم لتتبع أصغر عنصر داخل المجال غير المرتب:
Go
/* ترتيب الاختيار */
func selectionSort(nums []int) {
n := len(nums)
// الحلقة الخارجية: المجال غير المرتب هو [i, n-1]
for i := 0; i < n-1; i++ {
// الحلقة الداخلية: ابحث عن أصغر عنصر داخل المجال غير المرتب
k := i
for j := i + 1; j < n; j++ {
if nums[j] < nums[k] {
// سجّل فهرس أصغر عنصر
k = j
}
}
// بدّل أصغر عنصر مع العنصر الأول من المجال غير المرتب
nums[i], nums[k] = nums[k], nums[i]
}
}
TypeScript
/* ترتيب الاختيار */
function selectionSort(nums: number[]): void {
let n = nums.length;
// الحلقة الخارجية: المجال غير المرتب هو [i, n-1]
for (let i = 0; i < n - 1; i++) {
// الحلقة الداخلية: ابحث عن أصغر عنصر داخل المجال غير المرتب
let k = i;
for (let j = i + 1; j < n; j++) {
if (nums[j] < nums[k]) {
k = j; // سجّل فهرس أصغر عنصر
}
}
// بدّل أصغر عنصر مع العنصر الأول من المجال غير المرتب
[nums[i], nums[k]] = [nums[k], nums[i]];
}
}
خصائص الخوارزمية
- التعقيد الزمني ؛ ترتيب غير تكيّفي (non-adaptive): تضم الحلقة الخارجية جولة إجمالاً. وتُنفَّذ الحلقة الداخلية مرة في الجولة الأولى ومرة واحدة في الجولة الأخيرة. وبذلك تُنفَّذ و و و و مرة على التوالي، ومجموعها .
- التعقيد المكاني ؛ ترتيب في المكان (in-place): يستخدم المؤشران و مقداراً ثابتاً من المساحة الإضافية.
- ترتيب غير مستقر: كما يوضح الشكل أدناه، قد يُبدَّل العنصر
nums[i]إلى يمين عنصر مساوٍ له، مما يغيّر ترتيبهما النسبي.
