zoukankan      html  css  js  c++  java
  • ABAP 自定义排序的思想(不用系统标准的SORT语句)

    不用ABAP的标准SORT语句,你能将下面这个数组按从小到大(或从大到小)的顺序重新排列,并计算其算法复杂度吗?

    现在假设有一个数组:A = [106652102-65859915632102118]

    算法思想一:

    按数组顺序,每次读取一个数字放到新数组中,将这个数字与该数组中所有数字进行循环比较,确定存放位置

    原数组:A = [106652102-65859915632102118]

     

     步骤  

     排序后数组

    1

    10

    2

    10 66

    3

    10 52 66

    4

    10 52   66  102

    5

    -65 10 52 66 102

    6

    -65 10 52 66 85   102

    7

    。。。

    8

    。。。。。。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    算法思想二:

    每次从数组A重拿出一个最大(或最小)数字,拿出之后将数组A中的数字删除该数字,然后循环直到数组A被删空。

    原数组:A = [106652102-65859915632102118]

     

      步骤

       新数组

              数组A中剩余

    1

    -65

    106652102859915632102118

    2

    -65 1

    10665210285995632102118

    3

    -65 1 10 10

    6652102859956322118

    4

    -65 1   10 10 18

    66521028599563221

    5

    -65 1   10 10 18 21

    665210285995632

    6

    。。。

    。。。。。。

    7

    。。。。。。

    。。。

     

     

     

     

     

     

     

     

     

     

     

     

     

    人写的ABAP代码如下(采用的第二种算法思想,希望各位博友能看明白):

    1.首先随机制造10个[-100,100]内的随机不重复的数字放到数组A中,

    2.然后循环数组A,并每次取出一个最大的数字放到数组B中,然后删除数组A中的该数字,直到数组A被清空。

    代码如下:

     1 *&---------------------------------------------------------------------*
     2 *& Report  ZCHENH038
     3 *&
     4 *&---------------------------------------------------------------------*
     5 *&
     6 *&不用标准 sort语法 自己写排序语法
     7 *&---------------------------------------------------------------------*
     8 
     9 REPORT zchenh038.
    10 
    11 DATA:BEGIN OF a OCCURS 0,
    12       num TYPE i,
    13       END OF a,
    14      b LIKE STANDARD TABLE OF a.
    15 
    16 PERFORM frm_full_data .
    17 PERFORM frm_show_data USING '排序前'.
    18 
    19 PERFORM frm_sort.
    20 PERFORM frm_show_data USING '排序后'.
    21 
    22 
    23 *&---------------------------------------------------------------------*
    24 *&      Form  FRM_FULL_DATA
    25 *&---------------------------------------------------------------------*
    26 *       随机产生10个 -100 到100 之间不重复的数
    27 *----------------------------------------------------------------------*
    28 *  -->  p1        text
    29 *  <--  p2        a
    30 *----------------------------------------------------------------------*
    31 FORM frm_full_data.
    32   DATA:lv_len TYPE i.
    33   WHILE lv_len < 10.
    34 * 随机产生一个数
    35     CALL FUNCTION 'QF05_RANDOM_INTEGER'
    36       EXPORTING
    37         ran_int_max = 100
    38         ran_int_min = -100
    39       IMPORTING
    40         ran_int     = a-num.
    41     READ TABLE a WITH KEY num = a-num.
    42     CHECK sy-subrc <> 0.
    43     APPEND a.
    44     DESCRIBE TABLE a LINES lv_len.
    45   ENDWHILE.
    46 
    47 ENDFORM.                    " FRM_FULL_DATA
    48 *&---------------------------------------------------------------------*
    49 *&      Form  FRM_SORT
    50 *&---------------------------------------------------------------------*
    51 *       开始排序
    52 *----------------------------------------------------------------------*
    53 *  -->  p1        text
    54 *  <--  p2        a
    55 *----------------------------------------------------------------------*
    56 FORM frm_sort .
    57   DATA:lt_b LIKE a OCCURS 0 WITH HEADER LINE.
    58   WHILE a[] IS NOT INITIAL.
    59     PERFORM frm_get_min TABLES a
    60                       CHANGING lt_b-num.
    61     APPEND lt_b.
    62     DELETE a WHERE num = lt_b-num.
    63   ENDWHILE.
    64   a[] = lt_b[].
    65 ENDFORM.                    " FRM_SORT
    66 
    67 *&---------------------------------------------------------------------*
    68 *&      Form  frm_min
    69 *&---------------------------------------------------------------------*
    70 *       找出t_a 中最小的数 p_n
    71 *----------------------------------------------------------------------*
    72 *  -->  p1        t_a
    73 *  <--  p2        p_n
    74 *----------------------------------------------------------------------*
    75 FORM frm_get_min TABLES t_a LIKE b
    76                CHANGING p_n.
    77   READ TABLE t_a INDEX 1.
    78   p_n = t_a-num.
    79   LOOP AT t_a.
    80     IF t_a-num <= p_n.
    81       p_n = t_a-num.
    82     ENDIF.
    83   ENDLOOP.
    84 ENDFORM.                    "frm_min
    85 *&---------------------------------------------------------------------*
    86 *&      Form  FRM_SHOW_DATA
    87 *&---------------------------------------------------------------------*
    88 *       text
    89 *----------------------------------------------------------------------*
    90 *  -->  p1        text
    91 *  <--  p2        text
    92 *----------------------------------------------------------------------*
    93 FORM frm_show_data USING p_str TYPE string.
    94   WRITE:/,p_str,':'.
    95   LOOP AT a.
    96     WRITE:a-num,' '.
    97   ENDLOOP.
    98 ENDFORM.                    " FRM_SHOW_DATA
    View Code

    运行效果如图:

     

     

     

     

     

     

     

     

     

     

     

     

     

    欢迎访问我的博客! http://www.cnblogs.com/1187163927ch/
  • 相关阅读:
    运算符的优先级(从高到低)
    常用字符与ASCII代码对照表
    02.数据类型常量与变量
    Java基础01
    2以太坊入门的方法2
    区块链学习笔记1
    5关键字this与super的区别
    4Java中成员变量与局部变量
    lua返回页面时中文乱码
    struts2中<jsp:forward>跳转时报404错误的问题
  • 原文地址:https://www.cnblogs.com/1187163927ch/p/9364539.html
Copyright © 2011-2022 走看看