Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2009, 22:12   #1
Dobray
 
Регистрация: 17.11.2009
Сообщений: 6
По умолчанию С++ Естественное двухпутёвое слияние

Всем доброго времени суток. Возникла проблема с вышеуказанным видом сортировки. По заданию надо отсортировать именно им, но, к сожалению, нигде не могу найти банально код хотя бы на массиве. Препод выдал блоксхему (рисунок 123), так же блок схему я нашёл в инете (рисунок 456). Написал код по первой. Прошу проверить, ибо код не рабочий. Похоже выходит за границы массива, но я не в состоянии переделать код как надо, скил ещё не тот Ещё там вопрос отмечен, с какого индекса начинать пересылку? Логично что с нуля, но всё же
Работаю в MS VS 6
Примечание: код расчитан на использование goto...

Код:
#include <stdio.h>
int main() {
	int N=3;
	int K[3]={3,1,2};
	int s;
	int i, j, k, d, f, g, p;

	s=0;
metka1:
	if (s==0) {
		i=1; j=N; k=N+1; g=2*N;
	}
	else {
		i=N+1; j=2*N; k=1; g=N;
	}
	d=1; f=1;

metka2:
	if (K[i]>K[j]) {
		K[k]=K[j];
		k=k+d;
		j=j-1;
		if (K[j+1]<=K[j]) goto metka2;
		do {
			K[k]=K[i];
			k=k+d;
			i++;
		} while (K[i-1]<=K[i]);
metka3:
		f=0;
		d=-d;
		p=k;
		k=g;
		g=p;
		goto metka2;
	}
	else {
		if (i=j) goto metka4;
		K[k]=K[i];
		k=k+d;
		i++;
		if (K[i-1]<=K[i]) goto metka2;
		else {
			do {
				K[k]=K[j];
				k=k+d;
				j=j-1;
			} while (K[j+1]<=K[j]);
		}
	}
	goto metka3;
metka4:

	if (f==0) {
		s=1-s;
		goto metka1;
	}
	else {
		if (s==0) 
			for (int z=0; z<N; z++) K[z]=K[z+N];
	}
	printf("Itogo dolznno vivesti: 1 2 3.\n\n");
	for (int z=0; z<N; z++) 
		printf("K[%d] = %d\n", z, K[z]);
	return 0;
}

В дополнение ко всему нашёл код по Кнуту:
Natural two-way merge sort

Код:
N1:    s=0;
N2:    if (s==0) { i=1; j=N; k=N+1; l=2*N; }
       if (s==1) { i=N+1; j=2*N; k=1; l=N; }
       d=1; f=1;
N3:    if (R[i]->K>R[j]->K) goto N8; if (i==j) { R[k]=R[i]; goto N13; }
N4:    R[k]=R[i]; k+=d;
N5:    i+=1; if (R[i-1]->K<=R[i]->K) goto N3;
N6:    R[k]=R[j]; k+=d;
N7:    j-=1; if (R[j+1]->K<=R[j]->K) goto N6; else goto N12;
N8:    R[k]=R[j]; k+=d;
N9:    j-=1; if (R[j+1]->K<=R[j]->K) goto N3;
N10:   R[k]=R[i]; k+=d;
N11:   i+=1; if (R[i-1]->K<=R[i]->K) goto N10;
N12:   f=0; d=-d; t=k; k=l; l=t; goto N3;
N13:   if (f==0) { s=1-s; goto N2; }
       if (s==0) for (t=1; t<=N; t+=1) { R[t]=R[t+N]; }
переделывал под себя, задавал массив и т.д. не работает... не понял к чему тут подобные записи: R[i]->K?
Благодарю за внимание
Изображения
Тип файла: bmp 123.bmp (831.5 Кб, 152 просмотров)
Тип файла: bmp 456.bmp (455.8 Кб, 135 просмотров)

Последний раз редактировалось Dobray; 22.12.2009 в 22:19.
Dobray вне форума Ответить с цитированием
Старый 23.12.2009, 13:40   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Сортировка слиянием.
Сортировка слиянием основана на декомпозиции – массив разбивается на две примерно равные части, и после их рекурсивной сортировки выполняется операция слияния. Операция слияния двух отсортированных частей в одну, состоит в том, что из каждой части выбирается по одному элементу, и меньший из них помещается в результирующий массив. Так продолжается до тех пор, пока не будет исчерпана одна из частей, в этом случае оставшаяся часть переносится в конец результирующего массива.
В Вашей программе много ошибок.
Для начала (из выше сказанного) массив должен быть побольше, так как его необходимо разделить на два и каждый сортировать, а потом сортировать слиянием.
Есть такая книга "Алгоритмы. Просто как дважды два." И.В.Красиков. Там этот алгоритм описан. Относительно алгоритмов приведенных на рисунках, они я думаю правильны, но для индексации массивов в Паскале, в Си и С++ индексация с 0. Кроме схемы алгоритма обычно еще прилагают и описание переменных. Препод их дал?
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 23.12.2009, 16:13   #3
Dobray
 
Регистрация: 17.11.2009
Сообщений: 6
По умолчанию

за описание спасибо, но всё же без кода руки связаны...
Dobray вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слияние с HTML lion1 Microsoft Office Word 0 02.11.2009 12:23
Слияние Николетта Microsoft Office Word 1 25.05.2009 07:26
Слияние Николетта Microsoft Office Excel 2 30.04.2009 04:47
Естественное соединение Mat БД в Delphi 4 28.03.2009 12:27
Естественное слияние в массивах Virus-Haker Помощь студентам 2 07.02.2008 13:40