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

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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值