Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортровка строк

3.5K
12 мая 2004 года
Sheik
9 / / 01.11.2003
Надо создать динамический массив, в который программным путем вбиваются строки.
Затем эти строки нужно отсортировать любым методом, кроме метода пузырька.
P.S. Нельзя использовать стандартные функции сортровок, эта ф-ия должна быть написана.
Пожалуйста, выручите
537
12 мая 2004 года
Cover
87 / / 14.11.2002
Цитата:
Originally posted by Sheik
Надо создать динамический массив, в который программным путем вбиваются строки.
Затем эти строки нужно отсортировать любым методом, кроме метода пузырька.
P.S. Нельзя использовать стандартные функции сортровок, эта ф-ия должна быть написана.
Пожалуйста, выручите



Если можно узнать, сколько строк будет, то:
printf("how mutch strings: ");
scanf("%d",&s_num);
char **strings = new char*[s_num];
for(int i=0;i<s_num;++s_num)
{
strings = new char[1024];
printf("enter string #%d: ");
gets(strings);
}
// Для того, чтобы отсортировать, делаем ещё один массивчик
char **s_res = new char*[s_num];
// Вызываем функцию сортировки ;)
sort_strings(strings, s_res);
// и выводим результат пользователю


// В функции сортировки мы просто бирём (например, из инета) уже написанный кем-ни будь код и заменяем сравнение "<" (или какое там будет) на свою функцию "is_bigger(const char *s1, const char *s2)"

bool is_bigger(const char *s1, const char *s2)
{
if(strlen(s1)>strlen(s2)) return true;
if(strlen(s1)<strlen(s2)) return false;
for(int i=0;i<strlen(s1);++i)
if(s1<s2) return false;
return true;
}

//Можно, конечно и обычную strcmp(s1,s2) юзать - она возвращает разницу s1-s2, тока, кажется, размер строк как-то по другому учитывает



А если заранее не известно, сколько строк будет введено, то массив не прокатит, нужно юзать список:
struct str_node
{
char *str;
struct str_node *next;
str_node(char *s, str_node *n)
{
str = s;
next = n;
}
}

Ввод соответственно будет тоже другой:


str_node *root=NULL;
char *temp=NULL;
do{
temp = new char[1024];
printf("Enter string (or 'quit' to exit):");
if(temp!=gets(temp) || !strcmp(temp,"quit")) break;
str_node *x = new str_node(temp, root);
root = x;
}while(1);
if(temp) delete[] temp;

Ну и во всех обходах вместо фора, пишешь так:
for(str_node *x=root;x;x=x->next){
// соответственна текущая строка будет:
char *dur_str = x->str;
}




Не забудь потом очистить всю выделенную память.

537
12 мая 2004 года
Cover
87 / / 14.11.2002
Если вдруг не найдёшь готовые коды сортировок, могу на мыло кинуть .chm-файлик с описанием разных сортировок и с примерами их реализации.
4.8K
12 мая 2004 года
guardian1
12 / / 11.11.2003
Цитата:
Originally posted by Sheik
Надо создать динамический массив, в который программным путем вбиваются строки.
Затем эти строки нужно отсортировать любым методом, кроме метода пузырька.
P.S. Нельзя использовать стандартные функции сортровок, эта ф-ия должна быть написана.
Пожалуйста, выручите


зайди сюда посмотри алгоритмы сортировки

1.8K
13 мая 2004 года
MishaSt
170 / / 11.08.2003
Цитата:
Originally posted by Cover


Если можно узнать, сколько строк будет, то:
printf("how mutch strings: ");
scanf("%d",&s_num);
char **strings = new char*[s_num];
for(int i=0;i<s_num;++s_num)
{
strings = new char[1024];
printf("enter string #%d: ");
gets(strings);
}
// Для того, чтобы отсортировать, делаем ещё один массивчик
char **s_res = new char*[s_num];
// Вызываем функцию сортировки ;)
sort_strings(strings, s_res);
// и выводим результат пользователю


// В функции сортировки мы просто бирём (например, из инета) уже написанный кем-ни будь код и заменяем сравнение "<" (или какое там будет) на свою функцию "is_bigger(const char *s1, const char *s2)"

bool is_bigger(const char *s1, const char *s2)
{
if(strlen(s1)>strlen(s2)) return true;
if(strlen(s1)<strlen(s2)) return false;
for(int i=0;i<strlen(s1);++i)
if(s1<s2) return false;
return true;
}

//Можно, конечно и обычную strcmp(s1,s2) юзать - она возвращает разницу s1-s2, тока, кажется, размер строк как-то по другому учитывает



А если заранее не известно, сколько строк будет введено, то массив не прокатит, нужно юзать список:
struct str_node
{
char *str;
struct str_node *next;
str_node(char *s, str_node *n)
{
str = s;
next = n;
}
}

Ввод соответственно будет тоже другой:


str_node *root=NULL;
char *temp=NULL;
do{
temp = new char[1024];
printf("Enter string (or 'quit' to exit):");
if(temp!=gets(temp) || !strcmp(temp,"quit")) break;
str_node *x = new str_node(temp, root);
root = x;
}while(1);
if(temp) delete[] temp;

Ну и во всех обходах вместо фора, пишешь так:
for(str_node *x=root;x;x=x->next){
// соответственна текущая строка будет:
char *dur_str = x->str;
}




Не забудь потом очистить всю выделенную память.



Ужас! Ну и смесь С++ и С, да ещё с багами:

 
Код:
strings = new char[1024];
 printf("enter string #%d: ");
 gets(strings);

Использовать НЕЛЬЗЯ, переполнение буффера.......
Да и никто так не делает, а в С++ есть коньтейнеры, например контейнер string и контейнер vector, так что можно заюзать конейнер vector контейнеров string.
Вот для С++ , непроверял, сортировка по методу выбора, просто и быстро работает:
Код:
#include<vector>
#include<iostream>
#include<strings>
mysort(vector<string>& strs){
  int i,j,indmax;
  string maxstr;  
  for (i=strs.begin();i<strs.end();i++){
    maxstr=strs;
    indmax=i;
    for (j=i+1;i<strs.size();j++){
       if (strs[j]>maxstr){
         maxstr=strs[j];
         indmax=j;
       }
    }
    if (indmax!=i){
      strs[indmax]=strs;
      strs=maxstr;
    }
  }
}
void main(){
  vector<string> strs;
  string    mystr;  
  cout << "Enter some strings (Press Ctrl+Z to stop)\n";
  while (cin >> mystr)
    strs.push_back(mystr);
  mysort(strs);
}


С тоже разный бывает, если борландовский, то там есть всякие readln, а если не борландовский, то там надо писать процедуру, которая с консоли читать будет, вообщем больше инфы, на чём надо тебе???
А вообще самый рульный алгоритм, это пирамидальная сортировка. Токо программит немного сложней.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог