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

運行效果如圖:

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM