Быстрая и шейкерная сортировка

yana

Новичок
Быстрая и шейкерная сортировка

есть ли у кого, уважаемые, реализация алгоритма шейкерной и быстрой сортировки на php? очень надо
 

HraKK

Мудак
Команда форума
Добавь $ перед переменными))
PHP:
void Hashing_sort( T a[], const int n )
{
    int first = 0;
    int last = n;
    while( last > first )
    {
	for( int i=first; i<last-1; i++ )
	    if( a[i] > a[i+1] )
            {
                swap(a[i], a[i+1]);
/*
		T tmp = a[i];
		a[i] = a[i+1];
		a[i+1] = tmp;
*/
	    }
	--last;
	for( int i=last-1; i>first; i-- )
	    if( a[i] < a[i-1] )
            {
		swap(a[i], a[i-1]);
/*
                T tmp = a[i];
		a[i] = a[i-1];
		a[i-1] = tmp;
*/
	    }
	first++;
    }
}
 

yana

Новичок
Автор оригинала: HraKK
Добавь $ перед переменными))
спасибо, вроде работает

может у вас еще и вариант с шейкерной есть? хотя бы на си, но корректно работающий
 

zerkms

TDD infected
Команда форума
а если ходить на пары - то не придётся бегать по интернетам с пеной у рта и попрошайничать скрипты.
 

yana

Новичок
Автор оригинала: zerkms
а если ходить на пары - то не придётся бегать по интернетам с пеной у рта и попрошайничать скрипты.
я уж лет пять как отучилась, и пены у своего рта не наблюдаю

-~{}~ 01.12.08 15:36:

Автор оригинала: HraKK
гугл молчит?)
я недостаточно хорошо знаю Си, а примеров реализации на php что то не могу найти
 

HraKK

Мудак
Команда форума
PHP:
 int partition (mytype * m, int a, int b)
    {
      int i = a;
      for (int j = a; j <= b; j++)    // просматриваем с a по b
       {
         if (m[j] <= m[b])            // если элемент m[j] не превосходит m[b],
          {
            swap(m[i], m[j]);         // меняем местами m[j] и m[a], m[a+1], m[a+2] и так далее...
                                      // то есть переносим элементы меньшие m[b] в начало,
                                      // а затем и сам m[b] «сверху»
            i++;                      // таким образом последний обмен: m[b] и m[i], после чего i++
          }
       }
      return i-1;                     // в индексе i хранится <новая позиция элемента m[b]> + 1
    }
 
   void quicksort (mytype * m, int a, int b) // a - начало подмножества, b - конец
    {                                        // для первого вызова: a = 0, b = <элементов в массиве> - 1
     if (a >= b) return;
     int c = partition (m, a, b);
     quicksort (m, a, c-1);
     quicksort (m, c+1, b);
    }
Что тут вызывает затруднения?
 

yana

Новичок
предположим у меня массив $arr = array(10, 5, 8, 90, -5, -8);

код сортировки на php

PHP:
function partition ($arr, $a, $b)
{
	$i = $a;
	for ($j = $a; $j <= $b; $j++)    // просматриваем с a по b
	{
		if ($arr[$j] <= $arr[$b])            // если элемент m[j] не превосходит m[b],
		{
			$tmp = $arr[$i];
			$arr[$i] = $arr[$j];
			$arr[$j] = $arr[$i];
			$i++;                      // таким образом последний обмен: m[b] и m[i], после чего i++
		}
	}
	return $i-1;                     // в индексе i хранится <новая позиция элемента m[b]> + 1
}

function quick_sort($arr, $a, $b)
{
	 if ($a >= $b) return $arr;
     $c = partition ($arr, $a, $b);
     quick_sort ($arr, $a, $c-1);
     quick_sort ($arr, $c+1, $b);
	
	return $arr;
}

print_r(quick_sort($arr, 0, (count($arr)-1))); выводит

Array
(
[0] => 10
[1] => 5
[2] => 8
[3] => 90
[4] => -5
[5] => -8
)
 

HraKK

Мудак
Команда форума
У меня нету к сожалению рабочей станции сейчас, пройдитесь по коду и посмотрите на наличие логических или орфографических ошибок.
 

phprus

Moderator
Команда форума
yana
Подсказываю: Либо массивы надо передавать по ссылкам, либо не терять возвращаемые значения.
 

yana

Новичок
Автор оригинала: phprus
yana
Подсказываю: Либо массивы надо передавать по ссылкам, либо не терять возвращаемые значения.
все, разобралась, заработало. забыла передать ссылку во вторую функцию

спасибо всем большое
 
Сверху