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;
分析:若是正序,则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;
相关文章推荐
- PLSQL实现排序(冒泡、选择、快速)
- Java 常用排序算法实现--快速排序、插入排序、选择、冒泡
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现)(二): 插入,冒泡,选择,Shell,快速排序
- 冒泡,选择,插入,快速排序在Java中的实现
- 冒泡,快速,选择排序的Java实现
- java实现常见排序(选择,冒泡,插入,快速,希尔,堆)
- (数据结构排序的实验四)快速,冒泡,简单选择,直接插入排序的c语言实现!!
- java实现的冒泡、选择、快速排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- java实现七大排序(插入,冒泡,选择,快速,堆,希尔,归并)
- 冒泡、插入、快速、选择排序的java实现
- 常见的排序算法(Java实现):冒泡、插入、选择、快速排序
- java简单实现冒泡 快速 选择排序
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现): 插入,冒泡,选择,Shell,快速排序
- JavaScript实现冒泡(选择、快速)排序可视化
- c++实现冒泡,选择,插入,快速排序