快速排序
%%%-------------------------------------------------------------------
%%% @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]