Erlang 快速排序与洗牌算法

Erlang 快速排序与洗牌算法

快速排序

%%%-------------------------------------------------------------------
%%% @author Ming
%%% @copyright (C) 2019, <COMPANY>
%%% @doc 当函数需要导出时需要此注解
%%% 快速排序
%%% 1000万数组
%%% 打印时间
%%% 多个进程 (未完成)
%%% @end
%%% Created : 25. 六月 2019 9:55
%%%-------------------------------------------------------------------
-module(quick).
-author("Ming").

-export([start/0, quick/1, for/3, create/1]).

start() ->
  L = quick:for (1000000, 0, fun(I) -> I end),    %%获取倒序列表
  %%L = [rand:uniform(10000000) || _ <- lists:seq(1, 1000000)],   %%获取随机列表
  timer:tc(lists, sort, [L]).   %%打印函数运行时间, 这里为erlang自带排序函数lists:sort


%% @doc 快速排序
-spec quick(list()) -> list().
quick([]) -> [];
quick([Num | T]) ->
  quick([X || X <- T, X < Num]) ++ [Num] ++ quick([X || X <- T, X >= Num]).  %%合并列表


%% 获取倒序数组
for(0, Min, F) -> [F(Min)];
for(I, Min, F) -> [F(I)| for (I-1, Min, F)].

测试结果

erlang 自带sort
1> quick:start().                   %%参数为倒序列表
{70818,
 [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
  23,24,25,26|...]}
2> quick:start().                   %%参数为随机列表
{477805,
 [6,10,21,25,25,27,37,47,52,65,67,67,73,80,80,119,123,139,
  154,167,170,180,182,203,238,254,271|...]}


1> quick:start().				    %%参数为随机列表
{1085967,
 [10,14,19,19,19,29,33,67,71,80,88,89,101,104,109,109,122,
  130,141,143,156,187,192,203,204,206,233|...]}

手写的快速排序算法在参数为倒序排序时,50000数据量就崩溃了。

洗牌算法

%%%-------------------------------------------------------------------
%%% @author ASUS
%%% @copyright (C) 2019, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 25. 六月 2019 16:32
%%%-------------------------------------------------------------------
-module(reform).
-author("ASUS").

%% API
-export([start/0, reform/3]).

start() ->
  L = [3, 5, 1, 7, 10, j, k, q],
  New = [],
  reform(L, New, length(L)).


%% 洗牌算法
reform([], New, Len) -> New;
reform(L, New, Len) ->
  H = lists:nth(rand:uniform(Len), L),  %%取列表L其中随机一个数H
  New1 = [H|New],  %%将数H加入新列表
  T = lists:delete(H, L),   %%旧列表减去数H
  reform(T, New1, Len-1).


%% 获取数组长度  可用erlang自带的方法length([])代替
%%list_length([]) ->
%%  0;
%%list_length([H | L]) ->
%%  1 + list_length(L).

测试结果

1> reform:start().
[7,q,10,3,5,k,1,j]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值