Реализации алгоритмов/Сортировка/Быстрая: различия между версиями
Содержимое удалено Содержимое добавлено
DannyS712 (обсуждение | вклад) м <source> -> <syntaxhighlight> (phab:T237267) |
|||
Строка 7:
Работает для произвольного массива из n целых чисел.
<
Sub QSort(ByRef arr As Variant, ByVal iLbound As Integer, iUbound As Integer)
Dim iL As Integer, iU As Integer
Строка 36:
End If
End Sub
</syntaxhighlight>
==[[C Sharp|C#]]==
<
int partition (int[] array, int start, int end)
{
Строка 72:
quicksort (array, pivot+1, end);
}
</syntaxhighlight>
==[[Язык Си в примерах|C]]==
Работает для произвольного массива из n целых чисел.
<
int n, a[n]; //n - количество элементов
void qs(int *s_arr, int first, int last)
Строка 101:
}
}
</syntaxhighlight>
Исходный вызов функции qs для массива из n элементов будет иметь следующий вид.
<
qs(a, 0, n-1);
</syntaxhighlight>
== [[C Sharp|C#]] ==
<
int partition (int[] array, int start, int end)
{
Строка 142:
quicksort (array, pivot+1, end);
}
</syntaxhighlight>
=== C# с обобщёнными типами ===
Строка 148:
Тип Т должен реализовывать интерфейс [http://msdn.microsoft.com/ru-ru/library/4d7sx9hd.aspx IComparable<T>].
<
static int partition<T>( T[] m, int a, int b)
where T : IComparable<T>
Строка 179:
//
</syntaxhighlight>
=== C# с использованием лямбда-выражений ===
<
using System;
using System.Collections.Generic;
Строка 212:
}
}
</syntaxhighlight>
== [[Си++|C++]] ==
Строка 218:
=== Быстрая сортировка на основе библиотеки [[Си++/Стандартная библиотека|STL]] ===
<
#include <algorithm>
#include <iterator>
Строка 246:
quick_sort( first, last,
std::less_equal< typename std::iterator_traits< BidirectionalIterator >::value_type >()
);</
=== Для вещественных чисел ===
<
{
double x = *(a+r);
Строка 279:
quicksort (a, q+1, r);
}
}</
== [[Java]] ==
Строка 324:
и с измерением времени сортировки массива нанотаймером (работает только если нет совпадающих элементов массива).
<
import java.util.Random;
Строка 393:
}
}
</syntaxhighlight>
=== Java без рекурсии, с использованием стека ===
Строка 399:
пошаговый алгоритм с возможностью вывода на экран текущего действия
<syntaxhighlight>
import java.awt.Color;
import java.awt.Graphics;
Строка 533:
}
}
</syntaxhighlight>
== [[JavaScript]] ==
<
/*
* Алгоритм быстрой сортировки
Строка 600:
}
}
</syntaxhighlight>
'''function''' QuickSort(A, p, r)
Строка 631:
Через list comprehension:
<
def qsort(L):
if L: return qsort([x for x in L if x<L[0]]) + [x for x in L if x==L[0]] + qsort([x for x in L if x>L[0]])
return []
</syntaxhighlight>
Математическая версия:
<
def qsort(L):
if L: return qsort(filter(lambda x: x < L[0], L[1:])) + L[0:1] + qsort(filter(lambda x: x >= L[0], L[1:]))
return []
</syntaxhighlight>
== [[w:Joy|Joy]] ==
Строка 653:
== [[PHP]] ==
<
/*
* Функция, непосредственно производящая сортировку.
Строка 710:
}
</syntaxhighlight>
<
function quicksort ($array, $l=0, $r=0) {
if($r === 0) $r = count($array)-1;
Строка 731:
if ($j > $l) quicksort ($array, $l, $j);
}
</syntaxhighlight>
== [[Haskell]] ==
<
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
</syntaxhighlight>
Математическая версия — с использованием генераторов:
<
qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
</syntaxhighlight>
Данная версия алгоритма является самой короткой из возможных, но тратит слишком много дополнительной памяти. На практике такой алгоритм использоваться не может. Стоит также отметить, что списки — неудачный выбор для реализации быстрой сортировки.
Строка 750:
В отличие от других вариантов реализации на функциональных языках, представленных здесь, приводимая реализация алгоритма на Лиспе является "честной" - она не порождает новый отсортированный массив, а сортирует тот, который поступил ей на вход, "на том же месте". При первом вызове функции в параметры l и r необходимо передать нижний и верхний индексы массива (или той его части, которую требуется отсортировать). Код использует "императивные" макросы Common Lisp'а.
<
(defun quickSort (array l r)
(let ((i l)
Строка 765:
(if (>= (- r i) 1) (quickSort array i r)))
array)
</syntaxhighlight>
== [[w:Pascal|Pascal]] ==
Строка 771:
Внутреннее условие, помеченное комментарием «это условие можно убрать» — необязательно. Его наличие влияет на действия в ситуации, когда поиск находит два равных ключа: при наличии проверки они останутся на местах, а при отсутствии — будут обменены местами. Что займёт больше времени — проверки или лишние перестановки, — зависит как от архитектуры, так и от содержимого массива (очевидно, что при наличии большого количества равных элементов лишних перестановок станет больше). Следует особо отметить, что наличие условия не делает данный метод сортировки устойчивым.
<
const max=20; { можно и больше... }
type
Строка 803:
sort(Lo,Hi)
end; {quicksort}
</syntaxhighlight>
Устойчивый вариант (требует дополнительно O(n)памяти)
<
const max=20; { можно и больше… }
type
Строка 843:
end; {quicksort}
</syntaxhighlight>
=== Быстрая сортировка, нерекурсивный вариант ===
Нерекурсивная реализация быстрой сортировки через управляемый вручную [[w:стек|стек]].
Функции compare и change реализуются в зависимости от типа данных.
<
procedure quickSort(var X: itemArray; n: integer);
type
Строка 926:
until stack=nil
end;
</syntaxhighlight>
=== Частично рекурсивная реализация ===
Строка 933:
а бо’льшая — в цикле. Это гарантирует глубину рекурсии не более lg(N).
<
procedure qSort(var ar: array of real;);
procedure sort(var ar: array of real; low, high: integer);
Строка 962:
sort(ar, 0, High(ar));
end;
</syntaxhighlight>
=== Пример реализации алгоритма в объектно-ориентированном стиле с обобщением по типу данных (Generics) ===
Строка 1163:
== [[Perl]] ==
<
@out=(5,2,7,9,2,5,67,1,5,7,-8,5,0);
sub sortQ{
Строка 1180:
}
sortQ(0, $#out);
</syntaxhighlight>
== [[w:F Sharp|F#]] ==
<!-- http://habrahabr.ru/blogs/starting_programming/50967/ -->
<
let rec quicksort = function
[] -> []
Строка 1194:
let res = quicksort list1
</syntaxhighlight>
== [[w:OCaml|OCaml]] ==
<
let rec qsort l=match l with
[]->[]
|a::b-> (qsort (List.filter ((>=) a) b) lt) @ [a] @ (qsort (List.filter ((<) a) b ));;
</syntaxhighlight>
== [[w:Erlang|Erlang]] ==
<
qsort([]) -> [];
qsort([H|T]) -> qsort([X || X <- T, X < H]) ++ [H] ++ qsort([X || X <- T, X >= H]).
</syntaxhighlight>
== [[Язык программирования D|D]] ==
<
array qsort(array)(array _a)
{
Строка 1239:
}
</syntaxhighlight>
Более короткий вариант с использованием стандартной библиотеки Phobos:
<
import std.algorithm;
Строка 1253:
_qsort3( a[1..$].filter!( e => a[0] < e ).array );
}
</syntaxhighlight>
== [[Scala]] ==
<
def qsort(xs: List[Int]): List[Int] = xs match {
case head :: tail =>
Строка 1265:
case Nil => Nil
}
</syntaxhighlight>
Реализация с применением дженериков для типов данных, реализующих трейт Ordering:
<
def qSort[T](list: List[T])(implicit ord: Ordering[T]): List[T] = {
import ord._
Строка 1278:
}
}
</syntaxhighlight>
== [[w:Clojure|Clojure]] ==
Ленивая реализация:
<
(defn qsort [[x & xs]]
(letfn [(f [g] (qsort (filter #(g % x) xs)))]
(when x (lazy-cat (f <) [x] (f >=)))))
</syntaxhighlight>
== Shen/Qi II ==
<
(define filter
{(A --> boolean) --> (list A) --> (list A)}
Строка 1305:
[A]
(q-sort (filter (< A) [A|B]))))
</syntaxhighlight>
== [[w:VB.NET|VB.NET]] ==
Судя по тестам, сортировка пузырьком 5000 занимает в 8 с половиной раз больше времени, чем qSort'ом
<
Sub Swap(ByRef Val1, ByRef Val2)
Dim Proc
Строка 1362:
quicksort(a, 0, a.Length())
End Sub
</syntaxhighlight>
Вызов функции: <
== Встроенный язык 1С 8.* ==
Строка 1370:
Здесь приведен алгоритм сортировки на примере объекта типа «СписокЗначений», но его можно модифицировать для работы с любым объектом, для этого нужно изменить соответствующим образом код функций «СравнитьЗначения», «ПолучитьЗначение», «УстановитьЗначение».
<
Функция СравнитьЗначения(Знач1, Знач2)
Если Знач1>Знач2 Тогда
Строка 1430:
qs_0(Список, Первый, Последний);
КонецПроцедуры
</syntaxhighlight>
== [[w:Turbo Basic|Turbo Basic 1.1]] ==
<
LOCAL I,J,X,TEMP
Строка 1454:
FN QSORT=TRUE
END DEF
</syntaxhighlight>
Пример вызова функции FN QSORT(LOW,HIGH), входные и выходные данные в массиве DIM Y[N1:N2]
<
LOW=N1
HIGH=N2
F=FN QSORT(LOW,HIGH)
</syntaxhighlight>
== [[w:PL/SQL|PLSQL]] ==
<
----------------------------------------------------------------------------------
type sort_lst is table of integer;
Строка 1519:
end Quick_sort;
--------------------------------------------------------------------------------------------------------------------------------------------------
</syntaxhighlight>
{{BookCat | filing = deep}}
|