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.无返回值 ...
随机推荐
- Java同步机制总结--synchronized
不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话.JAVA中synchronized关键字能够 作为函数的修饰符,也可作为函数内的语句,也就是平时说的 ...
- nuget命令的用法:
nuget命令的用法: Install-Package 安装包 -Version 4.3.1 参数指定版本 Uninstall-Package 卸载包 Update-Package 更新包 Get ...
- Android 系统 root 破解原理分析 (续)
上文<Android系统root破解原理分析>介绍了Android系统root破解之后,应用程序获得root权限的原理.有一些网友提出对于root破解过程比较感兴趣,也提出了疑问.本文将会 ...
- NPN/PNP和N沟道/P沟道负载的接法
N沟道mos管和p沟道mos管负载的接法不一样,随意接的话导致VGS不满足条件:如下图N沟道接法,下拉电阻R2必须接,否则电路状态不稳定. 三极管原理类似如下图(满足三极管导通条件) NPN型三极管: ...
- js获取当前域名的方法
一.获取当前域名 1.方法一 var domain = document.domain; 2.方法二 var domain = window.location.host; 但是获取到的domain在线 ...
- unity, 获取mesh名称
正确的获取mesh名称的方法: MeshFilter meshFilter=node.GetComponent<MeshFilter>(); string meshName=mesh ...
- 设置CentOS控制台分辨率图文详解
最小化安装CentOS,默认是没有图形界面的,这个正合我意.但是命令行界面很小,会有很多输出被迫换行写,影响美观. 那么,怎样调整终端分辨率呢 解决方案:修改引导程序配置 /boot/grub/gru ...
- redis基础之订阅发布、主从复制和事务(四)
前面已经学习了redis的基本的命令行操作和数据类型,下面开始redis一些有趣的功能. 订阅和发布机制 定义:发布者相当于电台,订阅者相当于客户端,客户端发到频道的消息,将会被推送到所有订阅此频道的 ...
- Proguard语法及常用proguard.cfg代码段
本文主要ProGuard常用语法.标准proguard.cfg文件内容.常用proguard.cfg代码段及proguard与log level结合解决debug模式日志问题. 1.ProGuard的 ...
- zend server 和zend studio 最佳实践
1.zend server 安装好后需要重启下.无论是win还是mac..win不重启组件不能用.mac 不重启守护进程是离线的 2.修改apache配置.的根目录.到zendstudio的工作空间 ...