ABAP 自定义排序的思想(不用系统标准的SORT语句)
Posted 1187163927ch
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP 自定义排序的思想(不用系统标准的SORT语句)相关的知识,希望对你有一定的参考价值。
不用ABAP的标准SORT语句,你能将下面这个数组按从小到大(或从大到小)的顺序重新排列,并计算其算法复杂度吗?
现在假设有一个数组:A = [10,66,52,102,-65,85,99,1,56,32,10,21,18]
算法思想一:
按数组顺序,每次读取一个数字放到新数组中,将这个数字与该数组中所有数字进行循环比较,确定存放位置
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中剩余 |
1 |
-65 |
10,66,52,102,85,99,1,56,32,10,21,18 |
2 |
-65 1 |
10,66,52,102,85,99,56,32,10,21,18 |
3 |
-65 1 10 10 |
66,52,102,85,99,56,32,21,18 |
4 |
-65 1 10 10 18 |
66,52,102,85,99,56,32,21 |
5 |
-65 1 10 10 18 21 |
66,52,102,85,99,56,32 |
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 a OCCURS 0 WITH HEADER LINE, 15 c LIKE STANDARD TABLE OF a. 16 17 PERFORM frm_full_data. 18 19 WRITE:/,‘排序前:‘,/. 20 LOOP AT a. 21 WRITE:a-num,‘ ‘. 22 ENDLOOP. 23 24 PERFORM frm_sort. 25 WRITE:/,‘排序后:‘,/. 26 LOOP AT a. 27 WRITE:a-num,‘ ‘. 28 ENDLOOP. 29 30 *&---------------------------------------------------------------------* 31 *& Form FRM_FULL_DATA 32 *&---------------------------------------------------------------------* 33 * 随机产生100个 -100 到100之间的数 34 *----------------------------------------------------------------------* 35 * --> p1 text 36 * <-- p2 text 37 *----------------------------------------------------------------------* 38 FORM frm_full_data . 39 DATA:n TYPE int4, 40 lv_len TYPE i. 41 WHILE lv_len < 10. 42 43 CALL FUNCTION ‘QF05_RANDOM_INTEGER‘ 44 EXPORTING 45 ran_int_max = 100 46 ran_int_min = -100 47 IMPORTING 48 ran_int = n. 49 * 不产生重复数据 50 READ TABLE a WITH KEY num = n. 51 IF sy-subrc <> 0. 52 a-num = n. 53 APPEND a. 54 WRITE:‘随机产生了重复数据:‘,n,/. 55 ENDIF. 56 * 获取内表的行数 57 DESCRIBE TABLE a LINES lv_len. 58 ENDWHILE. 59 60 ENDFORM. " FRM_FULL_DATA 61 *&---------------------------------------------------------------------* 62 *& Form FRM_SORT 63 *&---------------------------------------------------------------------* 64 * 开始排序 65 *----------------------------------------------------------------------* 66 * --> p1 text 67 * <-- p2 text 68 *----------------------------------------------------------------------* 69 FORM frm_sort . 70 WHILE a[] IS NOT INITIAL. 71 CLEAR b. 72 PERFORM frm_get_min TABLES a CHANGING b-num. 73 APPEND b. 74 DELETE a WHERE num = b-num. 75 ENDWHILE. 76 CLEAR:a,a[]. 77 a[] = b[]. 78 ENDFORM. " FRM_SORT 79 80 *&---------------------------------------------------------------------* 81 *& Form frm_min 82 *&---------------------------------------------------------------------* 83 * 找出最小的数 84 *----------------------------------------------------------------------* 85 FORM frm_get_min TABLES p_a LIKE c CHANGING p_num TYPE i. 86 CLEAR:p_num. 87 READ TABLE p_a INDEX 1. 88 p_num = p_a-num. 89 LOOP AT p_a. 90 IF p_a-num <= p_num. 91 p_num = p_a-num. 92 ENDIF. 93 ENDLOOP. 94 ENDFORM. "frm_min
运行效果如图: