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

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

مثبّت
بدأه Snack3r في 23 يوليو 2012 · 7 رد · 9,783 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

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

تحياتي.

Algorithmes de tri et de recherche.pdf

1
#2

السلام عليكم

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

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

تحياتي.

#3

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

#4

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

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

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

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

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

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

اقتباس
...

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

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

إضافة بسيطة :

post-135620-071189200%201332596705.png

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

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

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

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

#6

@ خوارزم: كنت قرأت موضوعك وكتبت برنامج للفرز وأضفت وظيفة عادية للفرز إسمها 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);
    printf("%d}\n", sort->array);
}

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) {
                SWAP(sort->array[i+1], sort->array);
                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
#7

اكرمك الله

#8

السلام عليكم

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

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

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

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

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;

}

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