您的位置:首页 > 数据库

PLSQL实现排序(冒泡、选择、快速)

2012-12-17 19:43 246 查看
1、起泡排序法(平均时间复杂)

分析:若是正序,则j=n-1趟排序,每次进行n-j次比较,且不移动记录;

反之,要进行(n-1 + 1 ) * (n-1) /2次;总的时间复杂度为O(n平方)

create or replace function f_bible_sort(p_numbers in varchar2) return varchar2 is

Result varchar2(4000);

type t_table is table of char index by pls_integer;

v_tab t_table;

v_tmp char;

begin

for i in 1 .. nvl(length(p_numbers), 0) loop

v_tab(i) := substr(p_numbers, i, 1);

end loop;

for p in 1 .. nvl(length(p_numbers), 0) - 1 loop

for q in reverse p .. nvl(length(p_numbers), 0)-1 loop
---一定要从冒泡轨迹的起点开始比较。

if v_tab(q) <= v_tab(q+1) then

v_tmp := v_tab(q);

v_tab(q) := v_tab(q+1);

v_tab(q+1) := v_tmp;

end if;

end loop;

end loop;

for i in 1 .. nvl(length(p_numbers), 0) loop

Result := Result || v_tab(i);

end loop;

return(Result);

end f_bible_sort;

2、选择排序法

create or replace function f_choice_sort(p_numbers in varchar2) return varchar2 is

Result varchar2(4000);

type t_table is table of char index by pls_integer;

v_tab t_table;

v_tmp char;

begin

for i in 1 .. nvl(length(p_numbers), 0) loop

v_tab(i) := substr(p_numbers, i, 1);

end loop;

for p in 1 .. nvl(length(p_numbers), 0) - 1 loop

for q in p + 1 .. nvl(length(p_numbers), 0) loop

if v_tab(p) <= v_tab(q) then

v_tmp := v_tab(p);

v_tab(p) := v_tab(q);

v_tab(q) := v_tmp;

end if;

end loop;

end loop;

for i in 1 .. nvl(length(p_numbers), 0) loop

Result := Result || v_tab(i);

end loop;

return(Result);

end;

3、快速排序

1、借助包体创建索引数组类型(作为排序传入参数使用)

create or replace package t_array_pkg as

type t_array is table of number index by binary_integer;

end t_array_pkg;

2、排序存储过程

CREATE OR REPLACE procedure p_quick_sort(v_arr IN out t_array_pkg.t_array,

low in INT,

high in INT) IS

v_key_position INT;

v_low INT := low;

v_high INT := high;

--begin 以第一个元素为键值,差分为2组,并返回key值所在数组下标

procedure p_partitions(v_arr IN out t_array_pkg.t_array, low in INT, high in INT,position out int) IS

v_tmp number;

v_key int;

v_low int :=low;

v_high int :=high;

/* RESULT VARCHAR2(2000);*/

BEGIN

v_key := v_arr(v_low);

WHILE (v_low < v_high) LOOP

WHILE (v_low < v_high AND v_arr(v_high) >= v_key) LOOP

v_high := v_high - 1;

END LOOP;

v_tmp := v_arr(v_low);

v_arr(v_low) := v_arr(v_high);

v_arr(v_high) := v_tmp;

WHILE (v_low < v_high AND v_arr(v_low) <= v_key) LOOP

v_low := v_low + 1;

END LOOP;

v_tmp := v_arr(v_high);

v_arr(v_high) := v_arr(v_low);

v_arr(v_low) := v_tmp;

END LOOP;

v_arr(v_low) := v_key;

/*for i in 1 .. v_arr.count loop

Result := Result || v_arr(i)||',';

end loop;

dbms_output.put_line(Result);*/

position :=v_low;

END;

--end

BEGIN

if (low < high) then

p_partitions(v_arr, low, high, v_key_position);

p_quick_sort(v_arr, v_low, v_key_position - 1);

p_quick_sort(v_arr, v_key_position + 1, v_high);

end if;

/* for i in 1 .. v_arr.count loop

Result := Result || v_arr(i)||',';

end loop;

dbms_output.put_line(Result);*/

END;

3、排序调用

declare

v_arr t_array_pkg.t_array;

v_result varchar2(2000);

begin

---初始化要排序的数组

v_arr(1) := 33;

v_arr(2) := 11;

v_arr(3) := 44;

v_arr(4) := 4;

v_arr(5) := 3;

v_arr(6) := 2;

--快速排序

p_quick_sort(v_arr => v_arr, low => :low, high => :high);

--打印快速排序结果

for i in 1 .. v_arr.count loop

v_result := v_result || v_arr(i)||',';

end loop;

dbms_output.put_line(substr(v_result,1,length(v_result)-1));

end;

注意:也可以借助创建类型来实现 declare

v_arr t_array;

v_result varchar2(2000);

begin

---初始化要排序的数组

v_arr :=t_array();

v_arr.extend(6);

v_arr(1) := 33;

v_arr(2) := 11;

v_arr(3) := 44;

v_arr(4) := 4;

v_arr(5) := 3;

v_arr(6) := 2;

--快速排序

p_quick_sort(v_arr => v_arr, low => :low, high => :high);

--打印快速排序结果

for i in 1 .. v_arr.count loop

v_result := v_result || v_arr(i)||',';

end loop;

dbms_output.put_line(substr(v_result,1,length(v_result)-1));

end;

==================================================================

1、create type t_array is table of number ; ---创建数组类型

2、将p_quick_sort中的所有数组参数类型t_array_pkg.t_array 换为t_array ;

3、调用排序

declare

v_arr t_array;

v_result varchar2(2000);

begin

---初始化要排序的数组

v_arr :=t_array();

v_arr.extend(6);

v_arr(1) := 33;

v_arr(2) := 11;

v_arr(3) := 44;

v_arr(4) := 4;

v_arr(5) := 3;

v_arr(6) := 2;

--快速排序

p_quick_sort(v_arr => v_arr, low => :low, high => :high);

--打印快速排序结果

for i in 1 .. v_arr.count loop

v_result := v_result || v_arr(i)||',';

end loop;

dbms_output.put_line(substr(v_result,1,length(v_result)-1));

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐