zoukankan      html  css  js  c++  java
  • PLSQL实现排序(冒泡、选择、快速)

    转载 http://duqiangatom.blog.163.com/blog/static/11502518201051181157657/

    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;

  • 相关阅读:
    并查集图冲突hdu1272
    CentOS 7通过yum安装fcitx五笔输入法
    近期的技术问题让云供应商进行预设加密
    POJ 1166 The Clocks (暴搜)
    windows中的mysql修改管理员密码
    Visio画UML类图、序列图 for Java
    js中的时间与毫秒数互相转换
    java.lang.OutOfMemoryError: unable to create new native thread 居然是MQ问题
    WEB移动应用框架构想(转载)
    Android SDK安装教程
  • 原文地址:https://www.cnblogs.com/future2012lg/p/2883199.html
Copyright © 2011-2022 走看看