首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Prolog语言中的气泡排序

Prolog语言中的气泡排序
EN

Stack Overflow用户
提问于 2011-01-20 15:02:05
回答 5查看 14.6K关注 0票数 1

我必须实现气泡排序函数(排序算法)。

我已经实现了bubblesortswap,这是bubblesort的帮助函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
swap([X,Y|T1],[Y,X|T1]):-(Y<X,!).
swap([X|T1],[X|T2]):- swap(T1,T2).

bubblesort([],[]) :- !.
bubblesort(T1,T2) :- (bubblesort(swap(T1,T2),T2)).

我有一个无限的循环。我必须保留该功能的签名:

布布莱(T1,T2)

我在这个问题上困了两个小时。有人知道我该怎么做吗?

EN

回答 5

Stack Overflow用户

发布于 2014-07-02 03:29:55

在交换程序没有变化之前,请继续交换。如果交换中没有任何更改,那么您已经排序了列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bubblesort ( List, SortedList) :-
    swap ( List, List1 ), ! ,
    bubblesort ( List1, SortedList) .
bubblesort ( List, List).

swap ( [ X, Y | Rest ], [ Y, X | Rest ] ) :-
    X > Y, ! .
swap ( [ Z | Rest ], [ Z | Rest1 ] ) : -
    swap (Rest, Rest1 ).
票数 3
EN

Stack Overflow用户

发布于 2011-12-18 01:55:35

这个问题是由递归查询引起的。在查询bubblesort(T1, T2)时,它查询bubblesort(swap(T1, T2), T2),然后通过bubblesort/2的第二个子句,bubblesort(swap(swap(T1, T2), T2'), T2)T2统一为T2,然后循环。它永远不会得到swap(T1, T2)查询的第一个结果。

票数 1
EN

Stack Overflow用户

发布于 2011-01-20 17:45:16

简单的气泡排序算法由两个主循环组成:

  1. 遍历列表,“交换”每对元素,如果它们不是“按顺序”(内循环)。
  2. 在结果上重复(1),直到列表被完全排序(外部循环)。

内环(1)可以这样表示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
% performs a single pass of a bubble-sort on a list
do_bubble_sort([], []).
do_bubble_sort([X], [X]).
do_bubble_sort([X0,X1|Xs], [X0|Rem]) :-
    X0 =< X1, !,
    do_bubble_sort([X1|Xs], Rem).
do_bubble_sort([X0,X1|Xs], [X1|Rem]) :-
    do_bubble_sort([X0|Xs], Rem).

上面的do_bubble_sort/2接受一个列表,如果它们不满足=<测试(第3子句),则递归地交换列表中的连续元素。然后,外部循环谓词bubble_sort/2调用这个内环,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
% repeatedly performs a bubble sort on a list until it is sorted
bubble_sort(L, SL) :-
    do_bubble_sort(L, L0),
    (sorted_order(L0) ->
        SL = L0
    ;   bubble_sort(L0, SL)
    ).

这个谓词接受输入列表并递归地应用do_bubble_sort/2,直到谓词sorted_order/1对结果成功,即如果列表最终被排序。sorted_order/1可以定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
% checks a list of things are in sorted (ascending) order
sorted_order([]).
sorted_order([_]) :- !.
sorted_order([X0,X1|R]) :-
    X0 =< X1,
    sorted_order([X1|R]).

这个谓词接受一个列表,并递归地检查每一对连续元素是否按排序顺序排列(通过=<测试,就像我们在do_bubble_sort/2中使用的一样--这很重要,否则算法可能不会终止!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4753663

复制
相关文章
配置Oracle Gateway 12连接到SQL server 2014
最近的工作中需要基于Oracle连接到SQLserver2014,我们可以通过配置Gateway的方式来实现这个功能。这个Gateway的实质是透过dblink来实现的。即把SQLserver模拟成一个远端的Oracle实例,这个实例由Gateway来负责进行接收,转发等等。本文简要描述其配置过程。
Leshami
2018/08/13
2.9K0
配置Oracle Gateway 12连接到SQL server 2014
连接到PostgreSQL数据库
PG默认只接受本地的访问,这个规则是由参数listen_addresses控制的
姚远OracleACE
2023/09/06
4030
连接到PostgreSQL数据库
PHP 数据库抽象层 PDO
统一各种数据库的访问。 支持的数据库,只列出常用的 PDO_MYSQL PDO_PGSQL PDO_SQLITE 其他请查看这里 https://pecl.php.net/package-
康怀帅
2018/02/28
9290
数据库(PDO 对象常用方法)
PDO 是一个“数据库访问抽象层”,作用是统一各种数据库(MySQL、MSSQL、Oracle、DB2、PostgreSQL……)的访问接口,能轻松的在不同的数据库之间完成切换,使得数据库间的移植容易实现。
用户5745385
2019/07/19
6440
SRS:连麦和多个视频号联播
可用腾讯会议多人连麦后,推流到多个视频号实现联播。 流转发图 整个流是这么流转的: 连麦推视频号 首先,要开启视频号和直播功能,参考腾讯会议推流到视频号。 然后,使用腾讯会议发起一个会议(连麦),并推流到视频号: 视频号直播流 接着,在视频号小助手的直播管理中,就可以看到预览画面,预览使用的是HTTPS-FLV: Note:可以打开Chrome的Console,查看HTTPS-FLV的地址。 转推联播 最后启动FFmpeg或SRS的Ingester拉流,然后推给其他号: ffmpeg -f
Winlin
2022/03/18
2.3K1
PHP数据库扩展mysql、mysqli及pdo
1、mysql <?php $conn = mysql_connect("localhost", "root", "") or die("Mysql connect error"); my
Clive
2018/04/19
3.5K0
PDO详解
一、PDO诞生的意义 PHP对数据库支持的抽象度不够,接口不统一。每一种数据库环境都必须重新定义数据库的操作。在这种背景下,统一操作接口PDO诞生了。 在PHP中,有三种数据库连接方式: (1)mysql 最常用,过程式风格的一种应用 (2)mysqli,mysql函数的增强版,提供面向对象和过程两种风格的API,增加了预编译和参数绑定等新的特性 (3)PDO统一抽象接口,更类似于mysqli 二、PDO常用函数 PDO中包含三个预定义类:PDO、PDOStatement和PDOException (1)P
lonelydawn
2018/02/09
2K0
PDO详解
PHP基于PDO扩展操作mysql数据库示例
本文实例讲述了PHP基于PDO扩展操作mysql数据库。分享给大家供大家参考,具体如下:
用户8675788
2021/07/13
1.8K0
PHP PDO——单例模式实现数据库操作
PHP PDO——单例模式实现数据库操作 (原创内容,转载请注明来源,谢谢) 一、概述 PDO是PHP访问数据库的轻量、持久的接口,其提供一个抽象访问层。启用方法是在php.ini中把extension=php_pdo.dll的注释去掉即可。 PDO包含三个预定义类,PDO、PDOStatement、PDOException,其中PDOException是对Exception类的扩展。 下面的这些类的方法很常用,故列出来进行说明。 1)PDO PD
用户1327360
2018/03/07
2.9K0
PHP面向对象-PDO连接数据库(二)
在这个例子中,我们首先定义了一个插入语句,其中使用了两个占位符:username和:password。然后,我们使用PDO的prepare()方法来准备这个语句,并将其存储在$stmt变量中。接下来,我们使用$stmt的execute()方法来执行这个语句,并将参数传递给占位符。这个例子将在users表中插入一个新的用户名和密码。
堕落飞鸟
2023/04/29
5550
全新的PDO数据库操作类(仅适用Mysql)
  1年前,也差不多刚开博那会,分享过一个pdo的数据库操作类(可参见:http://www.cnblogs.com/hooray/archive/2011/06/30/2094743.html),与其说是类,其实就只是几个封装好的函数,整体略显稚嫩,但也是这么个东西,在公司里也用了1年之久。如今公司规模变大了,产品也日益完善,曾经的那个数据库操作函数虽说使用上没出什么大问题,但为了更显专业,花了1天时间重写了这个,现在,它确实是个类了。
胡尐睿丶
2022/03/23
6240
python连接到SQList数据库以及简单操作
背景了解: Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。Python定义了一套操作数据库的API接口,任何数据库要连接到Python, 只需要提供符合Python标准的数据库驱动即可 1:代码
Python研究者
2020/09/28
9170
python连接到SQList数据库以及简单操作
PDO扩展PDO::ATTR_AUTOCOMMIT 出坑记
我自己以swoole扩展为基础,封装了一个异步任务服务器框架,数据库操作使用pdo扩展,但是在插入数据的时候,出现了异常情况,具体状况如下:
luxixing
2019/05/28
9380
PHP PDO MySQL
连接 // 数据源 $dsn='mysql:host=localhost;dbname=imooc'; // uri 形式 $dsn='uri:file://G:\path' ... $pdo=new PDO($dsn,$username,$password); var_dump($pdo); exec() 执行一条 SQL 语句,并返回其受影响的行数。对于 select 没有作用。 创建表 插入记录 更新 删除 $query=<<<EOF CREATE TABLE IF
康怀帅
2018/02/28
3.5K0
点击加载更多

相似问题

对R中满足一次条件的前几行求和

111

检查组R中的前一行是否满足条件

26

查看组R满足条件的前一行和后一行

18

删除R中满足某些条件的行

10

根据条件更新分组数据中的行和删除几行

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文