Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_po_OAiPR.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
1.23 Mб
Скачать

143. Сортировка посредством вывода

Реализуется с помощью функции select.

Double *select(doube *s , int m, int n)

Int I,j;

Double c;

For (i=m;is[j])

{c=s[i]

S[i]=s[j];

S[j]=c;

}

Return (s);

}

Упорядоченный список В` получается из В многократным применением выборки из В. Минимального элемента, удалением его из В и добавлением в конец списка В`.B` первоначально пуст

B=<20,10,8,-5,7,>

Аналогично В и В` размещаются в разных частях массива S. Дополнительной памяти не требуется.

144. Слияние списков

A-N, В-M сливаются в один упорядоченный список С длинной M+N.

Если каждый элемент из А и В входит в С, точно один раз.

A=<6,17,23,3,9,4,7> 5

B=<19,25,38,60> 4

C=<6,17,19,23,25,38,3,9,4,7,60>

Для слияние списков А и В список С сначала полагается пустым, а затем к нему последовательно приписывается первый узел из А или В оказавшийся меньшим и отсутствующий в С. Составив функцию для слияния двух упорядоченных расположенных рядом частей массивов s, параметром этой функции будет исходный массив C, с выделением в нем двух упорядоченных расположенных рядом под массивом.

Merge будет осуществлять слияние под массивом образую на их месте упорядоченный массив с индексами от low до up.double *merge(double*sбште low, intup,int l)double *b,*c,v)

Int I,j,k

b=calloc (l,sizeof (double))

c=calloc(up+l-l, sizeof (double))

for(i=low;i<low+l;i++)

b=[c-low]=s[i]

for (i=0;i<up-l;i++)

c[i]=s[i+l+low]

v=(b[1]=c[up-l]=(s[low+l-1]>

s[up-l]))?s[low+l-1]

(s[up-l]+1;

I=(j=0);

K=low;

While (b[i]<v||c[j]<v)

{if (b[i]<c[j])

S[k]=b[i++]

Else

S[b]=c[j++]

K++

}

Return (s);

}

145. Сортировка списков путем слияния

Для получения упорядоченного списка b’ последовательность значений b

B=<K1,k2,…kn>

N

B1=<>k1>,b2= <k2>

Длина каждого из списка единица, затем осуществляется функция прохода, при которой m>=2 упорядоченных списков b1,b2…bn заменяется на m/2 или (m+1)/2 упорядоченных списков и b(2i)(2i<=n) и добавлением bm при нечетном m.

Проход повторяется до тех пор пока не получится одна последовательность длины N.

Приведем пример сортировки списка путем использования слияния последовательность будем отделять косой чертой, а элементы запятой.

9/7/18/3/52/4/6/8/5/13/42/30/35/26;

7,9/3,18/4/52/6/8/5/13/30/42/26/35;

3,7,9,18/4,6,8,52/5,13,30,42/25,35;

3,4,6,7,8,9,18,52/5,13,26,30,35,42;

3,4,5,6,7,8,9,13,18,26,30,35,42,52;

Эту операцию выполняет функция , она упорядочивает массив сортировкой слиянием используя описанную раннее функцию merge.

Double*smerge(double*,int m,int n);

{int l, low, up;

Double*merge(double*,int, int, int);

L=1;

While (l<=(n-m))

{low=m;

Up=m-l;

While(l+ap<n)

{up=(low+2*l-1<n)?(low+2*l-1):n;

Merge (s,low,up,l);

Low=up-l;

}

L*2;

}

Return(a);

}

Для такой сортировки можем составить рекурсивную функцию для сортировки массива либо его части.

Srecmg

При каждом вызове сортируемый массив делится на две равных части каждая из которых сортируется отдельно.

Double*srecmg(double*a,int n,int m)

{double*merge(double*, int, int, int );

Double*smerge(double*, int, int);

Int I;

If(n>m)

{i=(n+m)2;

Srecmg(a,m,i);

Srecmg(a,+дбт)

Merge(a,m,n,(n-m)/2+l);

}

Return(a);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]