• 0
ahmed.o.mohamed

خوارزميات البحث و الترتيب - فهرس السلسلة

سؤال

السلام عليكم

الإصدار الأول من هذه السلسلة يتكون من أربعة أجزاء:

في المرفقات, الإصدار الأول في ملف PDF.

تحياتي.

Algorithmes de tri et de recherche.pdf

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

السلام عليكم

وصلني صباح اليوم إيميل من إدارة موقع كتب يُفيد بقبول الكتاب :

خوارزميات البحث و الترتيب - الإصدار الأول

تحياتي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله خير اتمنى ان يحتوي على الترتيب المتوازي و الديناميكي و ليس فقط الترتيب المتسلسل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبة للترتيب الفقاعي هناك تحسين آخر يمكنك عمله ؟!!

لنفرض ان المصفوفة ترتبت من اول مره اي في اول pass هل ستكمل حلقة for الاولى حتى النهاية ؟؟

هل يمكنك ان تشرح خوارزمية الترتيب الفقاعي المتوازية ؟!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبة للترتيب الفقاعي هناك تحسين آخر يمكنك عمله ؟!!

لنفرض ان المصفوفة ترتبت من اول مره اي في اول pass هل ستكمل حلقة for الاولى حتى النهاية ؟؟

ذكرتُ هذه الإضافة في مقالة الــ Bubble sort, انظر :

...

لاحظ معي أنه تم ترتيب عناصر الجدول مع أن الحلقة لم تنتهي بعد فما زالت دورتان i=4, i=5.

ما رأيك لو أضفنا شرطا بسيطا يتعلق بالخروج من الدالة إذا وصلت الخوارزمية إلى ترتيب الجدول قبل انتهاء الحلقة ؟

إضافة بسيطة :

post-135620-071189200%201332596705.png

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

هل يمكنك ان تشرح خوارزمية الترتيب الفقاعي المتوازية ؟!

للأسف لا أملك حالياً الوقت الكافي للرد على سؤالك, أرجو المعذرة.

يُمكنني أن أخصص لسؤالك مقالة منفردة لاحقاً نظراً لأهمية الموضوع.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

@ خوارزم: كنت قرأت موضوعك وكتبت برنامج للفرز وأضفت وظيفة عادية للفرز إسمها bsort_sort وأخرى bsort_sort_thread تفرز عن طريق إنشاء عملية موازية وحيدة thread, لافائدة منها وحدها بل سيفيد إذا كنت تفرز أكثر من مصفوفة بحيث كل عملية تتولى مصفوفة أو تقسم المصفوفة على أكثر من عملية. يُمكنك أخذ الأفكار منه.

#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>

#define NELEMENTS(x) (sizeof(x) / sizeof(*(x)))
#define SWAP(a, b) \
do {\
a ^= b;\
b ^= a;\
a ^= b;\
} while(0);

typedef struct _SortObject {
int *array;
unsigned int nelements;
} SortObject;

SortObject *bsort_new(int *array, unsigned int nelements);
void bsort_destroy(SortObject *sort);
void bsort_dump(SortObject *sort, char *name);

void bsort_sort(SortObject *sort);
void bsort_sort_thread(SortObject *sort);
DWORD WINAPI bsort_thread_map_sort(void *sort);

int main(int argc, char **argv)
{
int array_one[] = {9, 10, 1, 5, 7, 4, 6, 3, 2, 8};
int array_two[] = {11, 13, 16, 20, 18, 15, 12, 14, 17, 19};


SortObject *obj_one = NULL;
SortObject *obj_two = NULL;

obj_one = bsort_new(&array_one[0], NELEMENTS(array_one));
if( obj_one == NULL ) {
perror("Error");
return -1;
}

obj_two = bsort_new(&array_two[0], NELEMENTS(array_two));
if( obj_two == NULL ) {
perror("Error");
bsort_destroy(obj_one);
return -1;
}

bsort_dump(obj_one, "array_one =");
bsort_sort(obj_one);
bsort_dump(obj_one, "array_one =");

bsort_dump(obj_two, "array_two =");
bsort_sort_thread(obj_two);
bsort_dump(obj_two, "array_two =");

bsort_destroy(obj_one);
bsort_destroy(obj_two);
return 0;
}

SortObject *bsort_new(int *array, unsigned int nelements)
{
SortObject *sort = NULL;

if( (sort = (SortObject*) malloc(sizeof(SortObject))) == NULL )
return NULL;

sort->array = array;
sort->nelements = nelements;

return sort;
}

void bsort_destroy(SortObject *sort)
{
free(sort);
}

void bsort_dump(SortObject *sort, char *name)
{
unsigned int i;

printf("%s -> {", name);
for( i = 0 ; i < sort->nelements - 1; i++ )
printf("%d, ", sort->array[i]);
printf("%d}\n", sort->array[i]);
}

void bsort_sort(SortObject *sort)
{
unsigned int i;
int keep_sorting = 1;

while(keep_sorting) {
keep_sorting = 0;
for( i = 0 ; i < sort->nelements - 1 ; i++ ) {
if( sort->array[i+1] < sort->array[i]) {
SWAP(sort->array[i+1], sort->array[i]);
keep_sorting = 1;
}
}
}
}

DWORD WINAPI bsort_thread_map_sort(void *sort)
{
bsort_sort((SortObject *) sort);
return 0;
}

void bsort_sort_thread(SortObject *sort)
{
DWORD dwThreadId;
HANDLE hThread;

hThread = CreateThread(0, 0, bsort_thread_map_sort, (void *) sort, CREATE_SUSPENDED, &dwThreadId);

if(hThread == NULL) {
printf("Error: bsort_sort_thread\n");
exit(-1);
}

ResumeThread(hThread);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}

مراجع : Win32 Multithreading and Synchronization | Creating Threads

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اكرمك الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

هذه الداله ترتب خطأ

مطلوب الترتيب حسب الارقم

لكنها با ترتب بالطريقه الصحيحه

ارجو المساعده

int t,h=o no[50];

a=fopen(fopen("c:\\monam.txt","rb");

rewind(a);

if(a==0)

{

printf("error");

getch();

exit(1);

}

fscanf(a,"%d%s%d%d%d",&st.nu,&st.name,&st.arbic,&st.english,&st.c);

while(!feof(a)

{

st.nu==no[h];

h++

fscanf(a,"%d%s%d%d%d",&st.nu,&st.name,&st.arbic,&st.english,&st.c);

}

fclose(a);

for(int i=0;i<h;i++)

for(int j=0;j<h;j++)

if(no[j]>no[j+1])

int temp=no[j];

no[j]=no[j+1];

no[j+1]=temp;

}

for(int r=0;r<h;r++)

{

printf("\n%d",no[r]);

}

printf("\n \t to pack press 0");

scanf("%d",&t);

if(t==0)

getch();

goto w;

}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .