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

需求

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


实现

%% 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]

分析流程

  1. 调用 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]);
    
  2. 调用 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]);
    
  3. 调用 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]);
    
  4. 调用 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]);
    
  5. 调用 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值