现在的位置: 首页 > 综合 > 正文

erlang 排序算法

2013年07月03日 ⁄ 综合 ⁄ 共 958字 ⁄ 字号 评论关闭

快速排序:拿一个数出来做基准,小放左,大放右

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


抱歉!评论已关闭.