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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2016, 10:51   #1
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию Сортировка линейного списка

Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctime>
#include <malloc.h>
int S=1;    //количество тестов
long long N=10000;   //количество элементов
long long count = 0;
double mtime = 0;
struct spisok
{
	long long a;
	spisok *next;
};
void ADDWorst(spisok **Head, spisok **End)
{
	
	if ((*Head) == NULL)
	{
		*Head = (spisok*)malloc(sizeof(spisok));
		*End = *Head;
		(*End)->next = NULL;

	}
	else
	{
		(*End)->next = (spisok*)malloc(sizeof(spisok));
		*End = (*End)->next;
		(*End)->next = NULL;

	}
	count--;	
	(*End)->a = count;
	//printf("%lld\n", (*End)->a);
void PrintSpisok(spisok  *Head)
{
	while (Head != NULL)
	{
		printf("%lld\n", Head->a);
		Head = Head->next;
	}
}
void Sort(spisok *Head)
{
	double ttime, counttime = 0;
	spisok *p = NULL;
	ttime = clock();
	while (Head != NULL)
	{
		spisok *node = Head;
		Head = Head->next;
		if (p == NULL || node->a < p->a)
		{
			node->next = p;
			p = node;
		}
		else
		{
			spisok *current = p;
			while (current->next != NULL && !(node->a < current->next->a))
			{
				current = current->next;
			}
			node->next = current->next;
			current->next = node;
		}
		
		
	}
	ttime = clock() - ttime;
	ttime = ttime / CLOCKS_PER_SEC;
	mtime = mtime + ttime;	
	//printf("Time = %f\n", ttime);
	//printf("*******************************\n");
}
void DelAll(spisok **Head)    //рабочая
{
	spisok *Prev = *Head;
	
	while ((*Head) != NULL)
		{
		Prev = *Head;
		(*Head) = (*Head)->next;
			free(Prev);
		}
	
	*Head = NULL;
}
void SpisokWorst()
{
	mtime = 0;
	spisok *Head = NULL;
	spisok *End = Head;
	
	for (int s = 0; s < S; s++)
	{
		count = N+1;
		for (int i = 0; i < N; i++)
		{
			ADDWorst(&Head, &End);
		}
		Sort(Head);
		
		//DelAll(&Head);
	}
	PrintSpisok(Head);
	mtime = mtime / double(S);
	printf("Middle time for worst %lf\n", mtime);
}
int main()
{
	
	SpisokWorst();
	
}
Создается линейный список(в данном случае на 100000 элементов) и заполняется в обратном порядке, т.е. 1ый элемент =10000, 2-оый=9999, 3ий = 9998 и так далее. Потом проходит сортировка и вывод времени, затраченного на сортировку. Суть в том, что если список заполнить рандомно или 1ый элемент =1, 2ой = 2 и так далее по порядку, то все работает, а если именно в обратном порядке, то время сортировки все время 0. И при попытке вывода отсортированного списка выводится только первый элемент = 10000. То есть сортировка не выполняется почему-то. Есть идеи в чем косяк?
ilyakonst вне форума Ответить с цитированием
Старый 20.04.2016, 15:33   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
		if (p == NULL || node->a < p->a)
		{
			node->next = p;
			p = node;
Даже в первую итерацию голова потеряет связь с реальностью при node->next = p; т.к. первоначально p = NULL.
Сортировка по значению или по адресам? Если адреса сортировать, то нужно адреса менять у 4-х записей, а не только у изменяющихся (добавить соседей ещё нужно)

Вот тут схема есть как это выглядит http://programmersforum.ru/showpost....79&postcount=2

Последний раз редактировалось eoln; 20.04.2016 в 15:36.
eoln вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка линейного списка перестановками crewww Общие вопросы C/C++ 5 20.04.2012 03:25
Сортировка линейного списка JolaGas Помощь студентам 1 30.05.2011 20:01
C# Сортировка линейного списка SaikoNS Помощь студентам 6 29.10.2010 21:06
Сортировка линейного списка alesfer Помощь студентам 1 03.04.2010 21:16
Сортировка линейного списка. ТИВ Паскаль, Turbo Pascal, PascalABC.NET 3 23.11.2008 22:39