erlang 排序算法

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

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



                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Erlang实现选择排序的代码和解释: ```erlang selection_sort(List) -> selection_sort(List, []). selection_sort([], Acc) -> Acc; selection_sort(List, Acc) -> {Min, Rest} = find_min(List), selection_sort(Rest, [Min | Acc]). find_min([H | T]) -> find_min(T, H, []). find_min([], Min, Rest) -> {Min, Rest}; find_min([H | T], Min, Rest) when H < Min -> find_min(T, H, [Min | Rest]); find_min([H | T], Min, Rest) -> find_min(T, Min, [H | Rest]). ``` 这里的选择排序算法使用了递归的方式实现。`selection_sort/1`函数是对外暴露的接口,它调用了`selection_sort/2`函数,并将一个空列表作为累加器传递给它。`selection_sort/2`函数有两个参数,第一个参数是待排序的列表,第二个参数是累加器。当待排序的列表为空时,`selection_sort/2`函数返回累加器。否则,它调用`find_min/1`函数查找列表中的最小元素,并将其插入到累加器的头部。然后,它递归调用自身,将剩余的元素和更新后的累加器作为参数传递给自己。 `find_min/1`函数用于查找列表中的最小元素。它调用了`find_min/3`函数,并将第一个元素作为初始最小值传递给它。`find_min/3`函数有三个参数,第一个参数是待查找的列表,第二个参数是当前的最小值,第三个参数是一个累加器,用于存储比当前最小值小的元素。当待查找的列表为空时,`find_min/3`函数返回当前的最小值和累加器。否则,它比较当前元素和当前最小值的大小,如果当前元素比当前最小值小,则将当前元素作为新的最小值,并将当前最小值插入到累加器的头部。然后,它递归调用自身,将剩余的元素、新的最小值和更新后的累加器作为参数传递给自己。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值