Консультация № 178030
25.04.2010, 09:28
43.34 руб.
0 3 1
Здравствуйте Уважаемые Эксперты.
Есть пример многопотоковой программы быстрой сортировки Хоара массива целых чисел.
Необходимо переделать ее для сортировки массива слов в алфавитном порядке методом Хоара.
Заранее благодарен.


Приложение:
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <iostream.h>
#include <conio.h>

#define N 20

struct arg
{
int left,right;
};

int x[N];

DWORD WINAPI sort(void* p) //поток для сортировки
{
int l=((arg *)p)->left, u=((arg *)p)->right;
int i,m,t,temp;
Sleep(rand()%2);
if (l<u)
{
t = x[l]; m = l;
for (i=l+1; i<=u; i++)
if (x[i]<t)
{
m++; temp=x[m]; x[m]=x[i]; x[i]=temp;
}
temp = x[l]; x[l]= x[m]; x[m]=temp;
arg *r1 = new arg, *r2 = new arg;
HANDLE H[2];
r1->left=l; r1->right= m-1;
r2->left= m+1; r2->right = u;
H[0]= CreateThread(0,0,sort, (void *)r1,0,0);
H[1]= CreateThread(0,0,sort, (void *)r2,0,0);
for (i=0; i<2; i++)
WaitForSingleObject(H[i],INFINITE);
delete r1; delete r2;
}
return 1;
}

void main()
{
int i;
for (i=0; i<N; i++) x[i]=rand()%100;
for (i=0; i<N; i++) cout << " "<< x[i];
cout << "\n";
arg a; a.left = 0; a.right = N-1;
sort(&a);
for (i=0; i<N; i++) cout << " "<< x[i];
cout << "\n";
getch();
}

Обсуждение

Неизвестный
25.04.2010, 20:37
общий
Не дай бог, кто-нибудь такую "многопотоковую" программу реально использовать будет :)

А так, надо поменять тип для переменных x, t, temp c int на char*. И вот это: if (x[i]<t) заменить на if(strcmp(x[i],t)>0)

У меня сейчас компилятора под рукой нет, так что ответом оформлять не буду. Проверьте у себя.
Неизвестный
26.04.2010, 15:08
общий
27.04.2010, 22:21
это ответ
Здравствуйте, Мих@ил.

Переделанная программа приведена в приложении. Программа сортирует массив указателей на слова — гораздо проще переставлять указатели, чем сами слова, тем более, что конечный результат тот же самый. Структура программы сохранена: cначала генерируется массив случайных слов, выводится на экран, сортируется, результат снова выводится не экран. Изменения небольшие:
- сравнение (x[i] < t) заменено на (strcmp( x[i], t ) < 0); соответственно, изменены типы некоторых аргументов;
- вывод на экран сделан отдельной функцией;
- вместо вызова WaitForSingleObject() в цикле, используется WaitForMultipleObjects();
- добавлен вызов srand( (unsigned)time(NULL) ) в начале программы для инициализации генератора псевдослучайных чисел.

Программа протестирована в MSVC++ 6.0.

Успехов!

Приложение:
/* 178030
Есть пример многопотоковой программы быстрой сортировки Хоара массива целых чисел.
Необходимо переделать ее для сортировки массива слов в алфавитном порядке.
*/
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <iostream.h>
#include <conio.h>

#define N 20

struct arg
{
int left,right;
};

char* x[N];


DWORD WINAPI sort(void* p) //поток для сортировки
{
int l = ((arg*)p)->left, u = ((arg*)p)->right;
if( l < u )
{
char* temp;
char* t = x[l];
int m = l;
for( int i=l+1; i<=u; i++ )
if( strcmp( x[i], t ) < 0 )
{
m++;
temp=x[m]; x[m]=x[i]; x[i]=temp;
}

temp = x[l]; x[l]= x[m]; x[m]=temp;

arg *r1 = new arg, *r2 = new arg;
HANDLE H[2];
r1->left=l; r1->right= m-1;
r2->left= m+1; r2->right = u;
H[0]= CreateThread(0,0,sort, (void *)r1,0,0);
H[1]= CreateThread(0,0,sort, (void *)r2,0,0);
// используем WaitForMultipleObjects() вместо вызова WaitForSingleObject() в цикле
WaitForMultipleObjects( 2, H, TRUE, INFINITE );
CloseHandle( H[0] );
CloseHandle( H[1] );
delete r1; delete r2;
}
return 1;
}

// вывод массива на экран
void print_array( char* x[], int n )
{
cout << "-----------------------------\n";
for( int i = 0; i < n; i++ )
cout << x[i] << endl;
cout << "-----------------------------\n";
}

void main()
{
srand( (unsigned)time(NULL) );

// генерируем массив случайных слов
for( int i = 0; i < N; i++ ) {
int len = 5 + rand()%10; // случайная длина слова от 5 символов
char* p = new char[len+1];
p[len] = 0;
while( len > 0 ) // генерируем случайное слово
p[--len] = rand()%26 + 'a';
x[i] = p;
}
cout << "\nInitial array:\n";
print_array( x, N );

arg a; a.left = 0; a.right = N-1;
sort( &a );
cout << "\nSorted array:\n";
print_array( x, N );

// освобождаем память
for( i = 0; i < N; i++ )
delete x[i];

cout << "Press a key to exit...";
cout.flush();

getch();
}
5
Неизвестный
27.04.2010, 15:39
общий
Мих@ил:
Спасибо Вам за оценку ответа!
Я глянул код еще раз и заметил ошибку: после WaitForMultipleObjects() надо обязательно добавить
CloseHandle( H[0] );
CloseHandle( H[1] );
Это не влияет на сортировку, но важно для освобождения системных ресурсов. Ресурсы, используемые самой функцией потока (например, стек) будут освобождены при завершении потока, а описатель (дескриптор, handle) потока (объект ядра), будет освобожден только при завершении программы, если его не закрыть явно вызовом CloseHandle(). Выход из функции потока не закрывает описатель (handle).
Форма ответа