Նախ՝ ցուցակի հանգույցի (node) սահմանումը, որտեղ բանալին
double տիպի է․
typedef struct _node node;
struct _node {
double data; /* բանալի */
node* next; /* կապ */
};
Հիմա տեղադրումով կարգավորման մասին։ Ալգորիթմի էությունն այն է, որ ամեն մի քայլում հերթական տարրը (իմ դեպքում՝ հանգույցը) տեղադրվում է իր ճիշտ տեղում։ Բնականաբար բուն տեղադրման գործողությունը կարևոր գործողություն է։ Սահմանում եմ insert_into() ֆունկցիան, որը տրված հանգույցը տեղադրում է տրված ցուցակի իր ճիշտ տեղում և վերադարձնում է ձևաձոխված ցուցակը։
node* insert_into( node* n, node* l )
{
/* եթե ցուցակը դատարկ է, ապա տրված հանգույցը
վերադարձնել որպես կարգավորված ցուցակ */
if( NULL == l ) {
n->next = NULL;
return n;
}
/* եթե տրված հանգույցի բանալին փոքր է տրված ցուցակի
առաջին հանգույցի բանալու արժեքից, ապա տրված
հանգույցը կցել ցուցակի սկզբից */
if( n->data <= l->data ) {
n->next = l;
return n;
}
/* ռեկուրսիվ կանչով տրված հանգույցը տեղադրել ցոցակի
պոչի մեջ, ապա նախնական ցուցակի առաջին հանգույցը
կապել ձևափոխված պոչին */
l->next = insert_into(n, l->next);
return l;
}
Ցուցակը կարգավորող sort_list() ֆունկցիան պարզապես կանչում է insert_into() ֆունկցիան․
node* sort_list( node* l )
{
/* ցուցակը դատարկ լինելու դեպքը */
if( NULL == l )
return NULL;
/* ցուցակի առաջին հանգույցը տեղադրել կարգավորված
պոչի մեջ՝ ճիշտ տեղում */
return insert_into(l, sort_list(l->next));
}
Այսքանը։
No comments:
Post a Comment