嘿伙计们我试图对列表进行排序,如下所示:
[peter-3, mark-2, sam-1]
给予:
[sam-1, mark-2, peter-3]
我尝试编辑插入排序的代码,但它似乎无法正常工作,它会返回' false'。
insert_sort(List,Sorted):-i_sort(List,[],Sorted).
i_sort([],Acc,Acc).
i_sort([H-N1|T],Acc,Sorted):- insert(H-N1,Acc,NAcc),
i_sort(T,NAcc,Sorted).
insert(X-N1,[Y-N2|T],[Y|NT]):- N1>N1,insert(X-N1,T,NT).
insert(X-N1,[Y-N2|T],[X-N1,Y-N2|T]):- N1=<N2.
insert(X-N1,[],[X-N1]).
答案 0 :(得分:1)
一种简单的方法是将其映射到一个易于使用msort/2
排序的列表,然后将其映射回原始形式:
num_name(Name-Num, Num-Name).
name_num(Num-Name, Name-Num).
sort_names_by_num(UnsortedNameNum, SortedNameNum) :-
maplist(num_name, UnsortedNameNum, UnsortedNumName),
msort(UnsortedNumName, SortedNumName),
maplist(name_num, SortedNumName, SortedNameNum).
关于您尝试修改插入排序的问题,您会遇到打字错误:
insert(X-N1,[Y-N2|T],[Y|NT]) :- ...
应该是:
insert(X-N1,[Y-N2|T],[Y-N2|NT]) :- ...
N1 > N1
应为N1 > N2
。那你的解决方案就可以了!
insert_sort(List, Sorted) :- i_sort(List, [], Sorted).
i_sort([], Acc, Acc).
i_sort([H-N1|T],Acc, Sorted) :-
insert(H-N1, Acc, NAcc),
i_sort(T, NAcc, Sorted).
insert(X-N1, [Y-N2|T], [Y-N2|NT]) :-
N1 > N2,
insert(X-N1, T, NT).
insert(X-N1, [Y-N2|T], [X-N1,Y-N2|T]) :- N1 =< N2.
insert(X-N1, [], [X-N1]).