pl/sql 实现归并算法 (合并插入法的优化)
CREATE OR REPLACE PACKAGE PG_MERGESORT IS -- Author : wealth_khb@126.com
-- Created : 2009-10-20 10:09:16
-- Purpose : TYPE EMP_SSN_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; ---声明数组类型
BEST_EMPLOYEES EMP_SSN_ARRAY; ----数组 BIG_UPPER INTEGER;
MIDDLE_VALUE NUMBER; ---------最大
-- Public function and procedure declarations
------初始化过程
PROCEDURE PRO_MERGESORT(UPPER_N IN NUMBER);
FUNCTION FUN_MERGESORT(UPPER_ARRAY IN EMP_SSN_ARRAY) RETURN EMP_SSN_ARRAY;
FUNCTION FUN_MERGE(LEFT_ARRAY IN EMP_SSN_ARRAY,
RIGHT_ARRAY IN EMP_SSN_ARRAY) RETURN EMP_SSN_ARRAY;
END PG_MERGESORT;
(包体部分) CREATE OR REPLACE PACKAGE BODY PG_MERGESORT IS PROCEDURE PRO_MERGESORT(UPPER_N IN NUMBER) IS
V_EMP_SSN_ARRAY EMP_SSN_ARRAY;
V_L INTEGER;
BEGIN
V_L := 1;
BIG_UPPER := UPPER_N; ---最大长度
------对数组赋值
FOR X IN 1 .. BIG_UPPER LOOP
BEST_EMPLOYEES(X) := X * (DBMS_RANDOM.VALUE(X, 1));
END LOOP;
---返回
DBMS_OUTPUT.PUT_LINE('排序前'||V_EMP_SSN_ARRAY.COUNT||'个');
FOR P IN BEST_EMPLOYEES.FIRST .. BEST_EMPLOYEES.LAST LOOP
DBMS_OUTPUT.PUT_LINE(BEST_EMPLOYEES(P));
END LOOP;
V_EMP_SSN_ARRAY := FUN_MERGESORT(BEST_EMPLOYEES);
---递归调用返回结果左边
DBMS_OUTPUT.PUT_LINE('结果输出'||V_EMP_SSN_ARRAY.COUNT||'个');
FOR v_1 IN V_EMP_SSN_ARRAY.FIRST .. V_EMP_SSN_ARRAY.LAST LOOP
DBMS_OUTPUT.PUT_LINE(V_EMP_SSN_ARRAY(v_1));
END LOOP; END;
-----------------------------------------------------
FUNCTION FUN_MERGESORT(UPPER_ARRAY IN EMP_SSN_ARRAY) RETURN EMP_SSN_ARRAY IS
V_UPPER NUMBER(18, 0);
V_MIDDLE NUMBER(18, 0);
V_VALUE EMP_SSN_ARRAY;
LEFT_ARRAY EMP_SSN_ARRAY; ----数组
RIGHT_ARRAY EMP_SSN_ARRAY; ----数组 BEGIN -------- V_UPPER := UPPER_ARRAY.COUNT;
IF (UPPER_ARRAY.COUNT = 1 OR UPPER_ARRAY.COUNT = 0) THEN
RETURN UPPER_ARRAY;
END IF; V_MIDDLE := floor(UPPER_ARRAY.COUNT / 2); FOR X IN 1 .. V_MIDDLE LOOP
LEFT_ARRAY(X) := UPPER_ARRAY(X);
RIGHT_ARRAY(X) := UPPER_ARRAY(X + V_MIDDLE);
END LOOP; IF (MOD(V_UPPER, 2) = 0) THEN
NULL;
ELSE
LEFT_ARRAY(V_MIDDLE + 1) := UPPER_ARRAY(V_UPPER);
END IF; LEFT_ARRAY := FUN_MERGESORT(LEFT_ARRAY);
RIGHT_ARRAY := FUN_MERGESORT(RIGHT_ARRAY);
----进行归并 V_VALUE := FUN_MERGE(LEFT_ARRAY, RIGHT_ARRAY);
RETURN V_VALUE;
END; FUNCTION FUN_MERGE(LEFT_ARRAY IN EMP_SSN_ARRAY,
RIGHT_ARRAY IN EMP_SSN_ARRAY) RETURN EMP_SSN_ARRAY IS
V_EMP_SSN_ARRAY EMP_SSN_ARRAY;
V_INT INTEGER := 0;
V_LEFT INTEGER := 0;
V_RIGHT INTEGER := 0;
V_LEFT_ARRAY EMP_SSN_ARRAY;
V_RIGHT_ARRAY EMP_SSN_ARRAY; BEGIN
V_LEFT_ARRAY := LEFT_ARRAY;
V_RIGHT_ARRAY := RIGHT_ARRAY; WHILE ((V_LEFT < V_LEFT_ARRAY.COUNT) AND
(V_RIGHT < V_RIGHT_ARRAY.COUNT)) LOOP
IF (V_LEFT_ARRAY(V_LEFT + 1) < V_RIGHT_ARRAY(V_RIGHT + 1)) THEN
V_INT := V_INT + 1;
V_LEFT := V_LEFT + 1;
V_EMP_SSN_ARRAY(V_INT) := V_LEFT_ARRAY(V_LEFT);
ELSE
V_INT := V_INT + 1;
V_RIGHT := V_RIGHT + 1;
V_EMP_SSN_ARRAY(V_INT) := V_RIGHT_ARRAY(V_RIGHT);
END IF;
END LOOP; WHILE (V_LEFT < V_LEFT_ARRAY.COUNT) LOOP
V_INT := V_INT + 1;
V_LEFT := V_LEFT + 1;
V_EMP_SSN_ARRAY(V_INT) := V_LEFT_ARRAY(V_LEFT);
END LOOP; WHILE (V_RIGHT < V_RIGHT_ARRAY.COUNT) LOOP
V_INT := V_INT + 1;
V_RIGHT := V_RIGHT + 1;
V_EMP_SSN_ARRAY(V_INT) := V_RIGHT_ARRAY(V_RIGHT);
END LOOP;
RETURN V_EMP_SSN_ARRAY;
END;
END PG_MERGESORT;
pl/sql 实现归并算法 (合并插入法的优化)的更多相关文章
- PL/SQL存储过程编程
PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- PL/SQL连接64位Oracle配置方法
问题原因: plsql developer无法连接64位oracle server的原因是,plsql是32位的,没有64位的版本,而oracle是64位,两者不兼容. 配置方法: 1.下载64位Or ...
- oracle 11g 64w 用32位的pl/sql
1. 下载64位Oracle,解压两文件,解压完成后将文件合并,安装: 2. 下载PL/SQL,安装: 3. 下载instantclient-basic-win32-11.2.0.1.0.zip ...
- 好吧,使用sql实现Dijkstra算法
我本来不想做这么蛋疼的事情的,可是更蛋疼的是我看了王大神的博客然后中毒了!我发誓再!不!看!了!不过问题本身还是有一点意思的,正好学过图论没有实现过dijkstra,刚好在慕课上又学了一点pl/sql ...
- 初试PL/SQL并行编程
-----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...
- PL/SQL批处理语句(BULK COLLECT子句和FORALL语句)
Oracle为PL/SQL中的SQL相关功能提供了FORALL语句和BULK COLLECT子句,显著的增强了SQL相关功能.这两个语句一起被称作PL/SQL的批处理语句.Oracle为什么要提供这两 ...
- Oracle基础(五)pl/sql进阶(分页过程)
编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...
随机推荐
- sql server Service Broker 相关查询
sql server Service Broker 相关查询 -- 查看传输队列中的消息 --如果尝试从队列中移除时,列将表明哪里出现了问题 select * from sys.transmissio ...
- 设置linux中tcp默认的20秒connect超时时间(转)
无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect.read.write的超时时间. 你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊. co ...
- AndroidStudio调用so文件
将*.so文件拷贝到app\libs\armeabi文件夹下 修改build.gradle文件,在buildTypes下添加 sourceSets { main { jniLibs.srcDirs = ...
- MSSQL如何访问ORACLE里的表
环境: MSSQL:2008 ORACLE DB:10.2.0.1 之前一直没有接触MSSQL,最近因需要MSSQL访问ORACLE里的表,下面是MSSQL连接ORACLE的配置过程. 1 ...
- AngularJS 路由:ng-route 与 ui-router
AngularJS的ng-route模块为控制器和视图提供了[Deep-Linking]URL. 通俗来讲,ng-route模块中的$routeService监测$location.url()的变化, ...
- Linux硬盘速度测试的命令
测试下硬盘的读写速度如何,在linux下可以使用hdparm 对硬盘进行测试或查看硬盘的相关信息. hdparm 命令进行硬盘速度测试.参数: -a 表示是否关闭磁盘预读取功能.对于大文件读取,这个显 ...
- atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html js --attilax总结
atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html js --attilax总结 4. 鼠标越过动态图片切换实现 1 4.1. 优先模式::css模式... 1 4.2. 其次 ...
- [svc]nginx优化25条
参考:
- 喵神 onevcat 的直播首秀
喵神 onevcat 的直播首秀 王巍在圈内人称喵神,我和他在网上很早就认识,平时多有交流.在我眼中,他是一个幽默风趣高手.虽然他的博客中主要内容是 iOS 开发,但是他实际上涉及的技术领域还包括 ...
- 简单集成高大上的ImagePicker无标题文章
简单集成高大上的ImagePicker无标题文章 现在是个项目就要有图片上传所以下面介绍一下简单高端的图片选择器 感谢读者的细心发现bug,最近bug已经修复(github更新)所以对文章部分内容 ...