Реализации алгоритмов/Сортировка/Быстрая: различия между версиями

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