Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Быстрая СОРТИРовка

Сообщения:  [1-10]   [11-15] 

 
 автор: mefestofel   (22.05.2007 в 11:28)   письмо автору
 
   для: alex19921992   (22.05.2007 в 05:40)
 

Исходный массив разбивается на n частей , в каждую из которых попадают элементы с шагом n, начиная от от 0,1,..., n-1, то есть:

0, n,      2n,      3n
1, n+1, 2n+1, 3n+1
2, n+2, 2n+2, 3n+2
...

Каждая часть сортируется отдельно с использованием алгоритма вставок или алгоритма обмена, Затем выбирается меньший шаг и алгоритм повторяется... Несмотря на увеличение циклов, суммарное число перестановок будет меньшим...
P.S. Шаг удобнее выбрать равным степеням 2. Сортировкой Шелла удобно сортироваь небольшие массивы...

  Ответить  
 
 автор: alex19921992   (22.05.2007 в 05:40)   письмо автору
 
   для: mefestofel   (22.05.2007 в 00:30)
 

что такое сортировка шелла?

  Ответить  
 
 автор: mefestofel   (22.05.2007 в 00:30)   письмо автору
 
   для: alex19921992   (21.05.2007 в 18:31)
 

Попробуйте 'быструю сортировку':

void Sort(int in[], int m, int n)
  {
   int i,j,res;
   if (m>=n) return;
   for(i=m, j=n, res=1;i<j;res>0?j--:i++)
   if (in([i]>in[j])
    {
     int k = in[i]; in[i]=in[j]; in[j]=k;
     res=-res; 
    }
   Sort(in,m,i-1);
   Sort(in,i+1,n);
  }

Можно доработать алгоритм, когда останется по 40 элементов в массиве, можно использовать сортировку вставками - увеличение скорости на 25% - лучший метод - это комбинация 'быстрой сортировки, сортировки вставками, сортировки Шелла', также на олимпиадах Вам могут подсунуть масиив, в котором средний элемент всегда будет максимумом или минимумом(O(n2) операций), в таких случаях можно перемешать элементы массива...

  Ответить  
 
 автор: alex19921992   (21.05.2007 в 18:31)   письмо автору
 
   для: mefestofel   (21.05.2007 в 18:03)
 

heapsort - пирамидальная сортировка основанная на составлении бинарного дерева... дальнейшие описания для меня непонятны.
>Тоже не понятно по сравнению с теми методами что я привел?
вы привели только названия методов, а не сами методы. я понимаю только пузырьковую и сортировку выбором(ищем макс. эл-т перемещаем в конец массива и повторяем те же методы только для массива на один эл-т меньше)
мне же надо деьальный разбор именно quicksort ибо его на олимпиадах всегда хватает, а вот пузырек или выбор не всегда катят...

  Ответить  
 
 автор: mefestofel   (21.05.2007 в 18:03)   письмо автору
 
   для: alex19921992   (21.05.2007 в 14:52)
 

> heapsort
Выкладывайе, посмотрим на него
>тоже не понятно
Тоже не понятно по сравнению с теми методами что я привел?
Тема интересная, можем расшириться и описать каждый метод + примеры...

  Ответить  
 
 автор: alex19921992   (21.05.2007 в 14:52)   письмо автору
 
   для: mefestofel   (20.05.2007 в 22:21)
 

есть еще heapsort но про него мне тоже не понятно

  Ответить  
 
 автор: oleg_alexeev   (21.05.2007 в 13:49)   письмо автору
 
   для: beginner-c++   (20.05.2007 в 14:44)
 


if (j<low) quicksort (j,low);


Тут точно ошибка. Не может j стать меньше low.

  Ответить  
 
 автор: mefestofel   (20.05.2007 в 22:21)   письмо автору
 
   для: alex19921992   (10.05.2007 в 16:29)
 

- сортировка вставками
- вставка погружением
- сортировка Шелла
- обменная сортировка
- Шейкер-сортировка
- сортировка подсчетом
- сортировка рекурсивным разделением
- сортировка слиянием
- 'быстрая сортировка'
Каждый из методов имеет свои + и -
последний особо интересный...

  Ответить  
 
 автор: alex19921992   (20.05.2007 в 16:58)   письмо автору
 
   для: beginner-c++   (20.05.2007 в 14:44)
 

непонятна строка:
while (i<=j);
тут у нас цыкл ниче не делает, так как стоит точка с запятой. если и меньше либо равно жи, то цыкл пропустится. если нет, то прога повиснет. зачем?

  Ответить  
 
 автор: beginner-c++   (20.05.2007 в 14:44)   письмо автору
 
   для: oleg_alexeev   (11.05.2007 в 13:43)
 

Имеется код быстрой сортировки:


#include <iostream.h>
#include <conio.h>
#include <stdio.h> 

int array[100000]; //massiv
void quicksort (long high, long low) // funkcija sortirovki
{
  long i,j;
  int p, temp;
  i=low;
  j=high;
  p=array[(low+high)/2];
  do
  {
    while (array[i]<p) i++;
    while (array[j]>p) j--;
    if(i<=j)
    {
      temp=array[i];
      array[i]=array[j];
      array[j]=temp;
      i++;
      j--;
    }
  }
  while (i<=j);
  if (j<low) quicksort (j,low);
  if (high>i) quicksort (high,i);
}

main()
{
  int size;
  int i;
  cin>>size;
  for (i=0; i<size; i++)
  cin>>array[i];
  quicksort (size-1,0);
  for (i=0; i<size; i++)
  cout<<array[i]<<" ";
  getchar();
  return 0;
}




на некоторых наборах элементов массива работает, на некоторых нет - не подскажете в чем причина?

  Ответить  

Сообщения:  [1-10]   [11-15] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования