【Erlang】十二、列表推导 实现对列表的排序

tech2024-10-27  18

需求

将一个数字列表由小到大进行排序


实现

%% list.erl -module(list). -export([sortNum/1]). %% 对纯数字列表排序:从小到大 %% Num:当前的数字,列表中第一个数字 %% List:取出第一个数字后,其余的列表 sortNum([Num|List]) -> %% 通过列表推导,找到比当前数字小的数字列表 sortNum([X || X <- List, X < Num]) %% 把当前的数字,放在比自己小的数字列表后边 ++ [Num] ++ %% 通过列表推导,找到比当前数字大的数字列表 sortNum([X || X <- List, X >= Num]); %% 排序结束 sortNum([]) -> [].

调用

> erl > list:sortNum([4,8,5,2,1]). [1,2,4,5,8]

分析流程

调用 list:sortNum([4,8,5,2,1]).sortNum([4|[8,5,2,1]]) -> %% 通过列表推导,找到比4小的数字列表,得到列表[2,1],等于 `sortNum([2, 1])` sortNum([X || X <- [8,5,2,1], X < 4]) %% 把4放在比自己小的数字列表后边 ++ [1] ++ %% 通过列表推导,找到比4大的数字列表,得到列表[8,5],等于 `sortNum([8,5])` sortNum([X || X <- [8,5,2,1], X >= 4]); 调用 sortNum([X || X <- [8,5,2,1], X < 4]) ,等于 sortNum([2, 1])sortNum([2|[1]]) -> %% 通过列表推导,找到比2小的数字列表, [1], 调用 sortNum([1]) sortNum([X || X <- [1], X < 2]) %% 把2放在比自己小的数字列表后边 ++ [2] ++ %% 通过列表推导,找到比2大的数字列表, 得到列表 [], 调用 sortNum([]) sortNum([X || X <- [1], X >= 2]); 调用 sortNum([X || X <- [1], X < 2]) ,等于 sortNum([1])sortNum([1|[]]) -> %% 通过列表推导,找到比1小的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [], X < 1]) %% 把8放在比自己小的数字列表后边 ++ [1] ++ %% 通过列表推导,找到比1大的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [1], X >= 1]); 调用 sortNum([X || X <- [8,5,2,1], X >= 4]) ,等于 sortNum([8,5])sortNum([8|[5]]) -> %% 通过列表推导,找到比8小的数字列表, 得到列表 [5], 调用 sortNum([5]) sortNum([X || X <- [5], X < 8]) %% 把8放在比自己小的数字列表后边 ++ [8] ++ %% 通过列表推导,找到比8大的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [5], X >= 8]); 调用 sortNum([X || X <- [5], X < 8]) ,等于 sortNum([5])sortNum([5|[]]) -> %% 通过列表推导,找到比8小的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [], X < 5]) %% 把5放在比自己小的数字列表后边 ++ [5] ++ %% 通过列表推导,找到比8大的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [], X >= 5]);

分析结果

流程5 返回 [5]

流程4 等于 流程5 ++ [8],结果 [5] ++ [8] = [5, 8]

流程3 返回 [1]

流程2 等于 流程3 ++ [2],结果 [1] ++ [2] = [1, 2]

流程1 等于 流程2 ++ [4] ++ 流程4,结果 [1, 2] ++ [4] ++ [5, 8] = [1,2,4,5,8]

试一下

有一个列表,里面的元素是商品的名字和价格,从高到低排序

List = [{apple, 120}, {milk,150}, {orange,155}, {paper, 10}, {book, 45}, {pen, 22}, {phone, 900}, {water, 20}]
最新回复(0)