الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الترتيب الفقاعي على القوائم المتصلة

بدأه MohammadKaraki في 18 يونيو 2009 · 1 رد · 854 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته,,

الفكرة البسيطة لخوارزمية الترتيب الفقاعي (Bubble Sort) عبارة عن مقارنة كائنين متجاورين، وتبديل مواقعهم إذا كان ترتيبهم خاطئ.

وهنا مثال يوضح تطبيق هذه الخوارزمية على ستة أرقام:

5	10	20	13	7	17
5	10	13	7	17	20
5	10	7	13	17	20
5	7	10	13	17	20	
5	7	10	13	17	20

وهذا الكود يوضح كيفية تطبيق هذه الخوارزمية في لغة السي على المصفوفات:

for (i=0; i<n-1; i++) 
	for (j=0; j<n-1-i; j++) {

		/* مقارنة العددين المتجاورين*/
		if (a[j+1] < a[j]) {	  
			/* تبديل المواقع*/
			tmp = a[j];		 
			a[j] = a[j+1];
			a[j+1] = tmp;
		}
 	}

الكود التالي هو تطبيق هذه الخوارزمية على القوائم المترابطة:

#include <stdio.h>

typedef struct sNode{
	struct sNode *next;
	int info;
}	Node;

Node *bSort(Node *list)
{
	Node *lst, *tmp = list, *prev, *potentialprev = list;
	int idx, idx2, n = 0;

	// تحديد عدد العقد في القائمة 
	for (;tmp->next; tmp=tmp->next)
		n++;

	for (idx=0; idx<n-1; idx++) {
		for (idx2=0,lst=list; lst && lst->next && (idx2<=n-1-idx); idx2++) {

			if (!idx2) 
				prev = lst;

			// مقارنة العقد المتجاورة
			if (lst->next->info < lst->info) {
				// تبديل العقد
				tmp = (lst->next?lst->next->next:0);
				if (!idx2 && (prev == list))
					list = lst->next;

				potentialprev = lst->next;
				prev->next = lst->next;
				lst->next->next = lst;
				lst->next = tmp;
				prev = potentialprev;
			} else {
				lst = lst->next;
				if(idx2)
					prev = prev->next;				 
			}	 
		} 
	}

	return list;
}

int main() {

	Node n1, n2, n3;

	n1.info = 6;
	n1.next = &n2;

	n2.info = 4;
	n2.next = &n3;

	n3.info = 7;
	n3.next = 0;

	Node * result = bSort(&n1);

	while( result ) {
		printf("%d\n", result->info);
		result = result->next;
	}

	getchar();
	return 0;
}

يقوم هذا الكود بتبديل عقدتين في قائمة إذا كانا في ترتيب خاطئ (يقوم بتبديل المؤشرات فقط)، والذي نحتاجه لهذه العملة معرفة العقدة التالية والسابقة للعقد المراد تبديلهم، هذا أعقد شيء في هذه الخوارزمية البسيطة!

بالتوفيق,,

تم تعديل هذه المشاركة بواسطة MoHammaD_93 في 18 يونيو 2009 في 02:52

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#2

مثال جميل .. يعطيك العافية

If you want to learn programming start with C++

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…