Password
    
 К титульной странице  |  Форум  |  О проекте  |  Словарь  |  Товары  |  Сделать стартовой  |  В Закладки   
Авторизация
Забыли пароль?
Регистрация 
 
Программирование
Безопасность
Демосцена
Игры
WEB-мастерская
Программное обеспечение
Аппаратное обеспечение



Последние материалы
  The Chronicles of Riddick: Escape from Butcher bay

  Что такое хорошо и что такое плохо, или FAQ по LCD-мониторам

  Организация удаленного доступа

  Инсталляция программного обеспечения используя GPO

  Smarty в веб-разработке

  BioShock или кафе разбитых надежд...



Последние новости
  Латвия подписала АСТА

  Примечательная промо-акция игры STAR WARS: The Old Republic на Times Square в Нью Йорке

  На сайте выложены первые выпуски легендарной телепередачи о компьютерных играх "От винта!"

  На сайте опубликован энциклопедический словарь по информатике Э.Якубайтиса

  Конференция Разработчиков Видеоигр, 1979

  Более шустрый и динамичный Mail.lv



Charitable advertising
Њл ­г¦¤ Ґ¬бп ў ў иҐ© Ї®¬®йЁ!



Ziedot.lv

Penn State Child Life Program



Программирование --> C/C++
Алгоритмы в С++. Часть 1. Сортировки.
  
Автор: \/\/oz3qK
Источник:RusH security team
Опубликовано: [2004-11-15 00:00]
Данный блок статей предназначен для новичков. Но может пригодится и для профессионалов.

В этой статье не будет идти речь о синтаксисе языка С++. Люди не знакомые с основами языка могут найти книгу на

http://www.anriintern.com/computer/c++/spisok.html
http://yura-k.kiev.ua/straus/
http://www.helter10.narod.ru

Все программы протестированы на Borland C++ Builder 6, но должны идти и на других. Написаны они как консольные приложения, но кодер без труда применит их и в прогах с интерфейсом. Приступим...

Пожалуй, самой первой программой в этом цикле статей должна быть сортировка. Суть сортировки состоит в том, чтоб отсортировать данные в файле, отсортировать массив чисел в порядке их возрастания или убывания. Сортировки необходимая вещь в современном мире. Программы, работающие с базами данных, различные программы применяют сортировки. Наверное, вам приходилось сортировать какие-то данные.

Самая простая сортировка (так называемый "пузырек"). Отсортируем с ее помощью массив: 17 9 6 14 19 5
Проходим от первого элемента до последнего и сравниваем соседние элементы. Если слева больше, то меняем их местами (таким образом, справа всегда будет больший). После такого преобразования будет такое :

9 6 14 17 5 | 19 - 19 уже отсортировано, теперь можно проходить не до конца, а на один элемент меньше. После второй операции :
6 9 14 5 | 17 19 -Потом:
6 9 5 | 14 17 19
6 5 | 9 14 17 19
5 | 6 9 14 17 19

Вот и все. Текст сортировки приведен ниже.

<##################################################>
#include <iostream>
using namespace std;
//======================================
int array[100]; // наш массив
//======================================
void Sort(int col) // сортировка
{
   int trash=0; // временная переменная для
// хранения промежуточного
// результата
   for (int i=1; i<=col ; i++) // пока не равно количеству
// елементов
     {
       for (int j=1; j<=col-i; j++)// пока не равно col-i
         {
             if (array [j]>array [j+1])// если левый элемент больше
                {
                  trash=array[j]; // правого, то меняем
                  array [j]=array [j+1];// их местами
                  array [j+1]=trash;
                }
          }
     }
}
//======================================
void Out(int col) // вывод на экран нашего
{
    for (int i=1; i<=col; i++) // массива после сортировки
      cout << array [i] <<" ";
    cout << endl;
}
//======================================
int main()
{
    int col_el;
    cout << " Enter length of array"<< endl;
    cin >> col_el; // считываем количество элементов
        for (int n=1; n<=col_el; n++) // считываем элементы массива
          cin >> array[n];
    Sort(col_el);
    cout << "Result is :"< // сортируем их...
    Out(col_el); // и выводим
    cin >> col_el; // ждем нажатия клавиши
    return 0;
}
<##################################################>

Данная программа не доделана окончательно, в частности нет проверки на выход за пределы массива и прочее... Мы заводим массив на 100 элементов, затем считываем количество элементов вызываем процедуру сортировки. Вроде все понятно...

Это можно упростить до следующего вида :

<##################################################>
#include <iostream>
using namespace std;
//======================================
int array[100];
//======================================
void Sort(int col)
{
     int trash=0;
     bool f=true;
     for (int i=1; (i<=col) && (f=true) ; i++)
       {
          f=false;
          for (int j=1; j<=col-i; j++)
             {
                if (array [j]>array [j+1])
                  {
                     trash=array[j];
                     array [j]=array [j+1];
                     array [j+1]=trash;
                     f=true;
                  }
             }
       }
}
//======================================
void Out(int col)
{
    for (int i=1; i<=col; i++)
      cout << array [i] <<" ";
    cout << endl;
}
//======================================
int main()
{
    int col_el;
    cout << " Enter length of array"<< endl;
    cin >> col_el;
        for (int n=1; n<=col_el ; n++)
    cin >> array[n];
    Sort(col_el);
    cout << "Result is :"<< endl;
    Out(col_el);
    cin >> col_el;
    return 0;
}
<##################################################>

Суть упрощения заключается в том, что используется дополнительная булевская переменная F. При каждом заходе в первый цикл ей присваивается значение false и если в процессе выполнения один из элементов будет не отсортирован, то значение этой переменной меняется на true и первый цикл продолжается дальше. Если значение не поменялось, то это значит, что уже нечего сортировать.

Данная сортировка выполняет n*(n-1)*(n-2)*...*(2)*(1) операций в худшем случае.

Следующая сортировка носит название "сортировка Шейкера". Она похожа на первую, но более оптимизирована. Суть оптимизации в том, что данные сортируются "волнообразно", программа проходит массив с лева на право, а потом с права на лево. Когда идем с лева, то собираем справа большие числа, а когда справа, то собираем слева меньшие.

<##################################################>
#include <iostream>
using namespace std;
//======================================
int array[100];
//======================================
void Sort(int col)
{
     int trash=0;
     bool f=true;
     for (int i=1; (i<=col) && (f=true) ; i++)
       {
          f=false;
          for (int j=i; j<=col-i; j++) // проходим с лева на право
             {
                if (array [j]>array [j+1]) // если число слева больше числа
               {
                  trash=array[j]; // справа, то меняем местами
                  array [j]=array [j+1]; // справа собираются большие числа
                  array [j+1]=trash;
                  f=true;
               }
             }
               for (int j=col-i-1; j>i ; j--) // проходим с права на лево
                 {
                   if (array [j] // если число справа меньше числа
                   {
                   trash=array[j]; // слева, то меняем местами
                   array [j]=array [j-1]; // слева собираются меньшие числа
                   array [j-1]=trash;
                   f=true;
                 }
                 }
             }
}
//======================================
void Out(int col)
{
    for (int i=1; i<=col; i++)
      cout << array [i] <<" ";
    cout << endl;
}
//======================================
int main()
{
    int col_el;
    cout << " Enter length of array"<< endl;
    cin >> col_el;
    cout << " Enter array elements"<<endl;
     for (int n=1; n<=col_el ; n++)
        {
    cout <<n<<" :" << "\t";
    cin >> array[n];
        }
    Sort(col_el);
    cout << "Result is :"<<endl;
    Out(col_el);
    cin >> col_el;
    return 0;
}
<##################################################>

По сравнению с сортировкой методом "пузырька", эта сортировка быстрее. И выполняются n*(n-1+n-2)*(n-2+n-3)*...*(2+1)=n*(2n-3)*(2n-5)*...*3. В следующих статьях, я расскажу про более быстрые сортировки и о самой быстрой известной сортировке. Что не ясно, пишите на woz3qk@mail.ru. Отвечу. До встречи...





Перейти к рубрике --> C & C++

Наши друзья
Juridiskie pakalpojumi  
IT Works
  Codenet - всё для программиста
   
• Hi-tech NEWS • InCube e-mag
  Программисты, Вам сюда!
КомментарииВсего:0


Только зарегистрированные пользователи могут оставлять здесь комментарии. Зарегистрироваться можно здесь. Если вы уже зарегистировались ранее, то можете войти в систему здесь.


© Mihail Chernov (MiHack) Обмен ссылками