【问题标题】:Prolog Quicksort using second element as a pivotProlog Quicksort 使用第二个元素作为枢轴
【发布时间】:2019-12-12 03:43:56
【问题描述】:

我一直在尝试学习 prolog,我想使用列表的第二个元素作为快速排序的枢轴。

我想用 [Head | [枢轴| Tail] ] 作为方法中的输入会起作用,但是我不确定我可以在哪里放置“Head”,即第一个元素。

像这样:

qsort([],[]):- !.
qsort([Head|[Pivot|Tail]],Sorted):-
        split(Pivot,[Head|Tail],Less,Greater),
        qsort(Less,SortedLess),
        qsort(Greater,SortedGreater),
        append(SortedLess,[Pivot|SortedGreater],Sorted).
split(_,[],[],[]).
split(Pivot,[X|T],[X|Less],Greater):-
        X=<Pivot,split(Pivot,T,Less,Greater).
split(Pivot,[X|T],Less,[X|Greater]):-
        X>Pivot,split(Pivot,T,Less,Greater).

但是,当我尝试使用 qsort([8, 3, 4, 12, 25, 4, 6, 1, 9, 22, 6], Sorted). 对列表进行排序时,它只会返回 false。我做错了什么?

【问题讨论】:

  • 您没有考虑使用 one 元素对列表进行排序。该列表与[Head|[Pivot|Tail]] 不匹配。

标签: prolog pivot quicksort


【解决方案1】:

但是,当我尝试使用 qsort([8, 3, 4, 12, 25, 4, 6, 1, 9, 22, 6], Sorted) 对列表进行排序时。它只是返回 false。我做错了什么?

最终,此算法将使用具有 恰好一个元素的列表进行调用,而您没有定义将与该列表匹配的 qsort/2 子句。

您可以通过添加规则来解决此问题:

qsort([],[]).
qsort([X], [X]).
qsort([Head, Pivot|Tail],Sorted):-
        split(Pivot,[Head|Tail],Less,Greater),
        qsort(Less,SortedLess),
        qsort(Greater,SortedGreater),
        append(SortedLess,[Pivot|SortedGreater],Sorted).

这给了我们:

?- qsort([8, 3, 4, 12, 25, 4, 6, 1, 9, 22, 6], Sorted).
Sorted = [1, 3, 4, 4, 6, 6, 8, 9, 12|...] ;
false.

【讨论】:

  • 完美。太感谢了!这是我在这个网站上的第一个问题;你们非常乐于助人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多