快速排序:拿一个数出来做基准,小放左,大放右
sort([]) -> [];
sort([H|T]) -> sort([X||X<-T,X<H]) ++ [H] ++ sort([X||X<-T,X>=H]).
插入排序:维护一个有序列和无序列,假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.
sort([]) -> [];
sort([H|T]) -> sort([H],T,[]).
sort(A,[],[]) -> A;
sort(A,[],B) -> B++A;
sort([],[B1|B2],N) -> sort(N++[B1],B2,[]);
sort([A1|A2],[B1|B2],N) ->
if
A1<B1 -> sort(A2,[B1|B2],N++[A1]);
A1>=B1 -> sort ([B1,A1|A2],B2,N)
end.
归并排序:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
-module(sort_gb).
-compile(export_all).
sort([]) -> [];
sort([A]) -> [A];
sort(L) ->
{L1,L2} = lists:split(length(L) div 2,L),
sort(sort(L1),sort(L2)).
sort([],L) -> L;
sort(L,[]) -> L;
sort([H1|T1],[H2|T2]) ->
if
H1 =< H2 -> [H1|sort(T1,[H2|T2])];
H1 > H2 -> [H2|sort([H1|T1],T2)]
end.
堆排序:就实现一个完全二叉树,loop(取树根,调整树结构)。可选大根堆和小根堆的实现方式。
https://github.com/daqing/algorithms/blob/master/heap_sort/heap_sort.erl