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

运行效果如图:

ABAP 自定义排序的思想(不用系统标准的SORT语句)
算法思想一:
算法思想二: