不用ABAP的标准SORT语句,你能将下面这个数组按从小到大(或从大到小)的顺序重新排列,并计算其算法复杂度吗?
现在假设有一个数组:A = [10,66,52,102,-65,85,99,1,56,32,10,21,18]
算法思想一:
按数组顺序,每次读取一个数字放到新数组中,将这个数字与该数组中所有数字进行循环比较,确定存放位置
原数组: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 = [10,66,52,102,-65,85,99,1,56,32,10,21,18]
步骤 |
新数组 |
数组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 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
运行效果如图:
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18029.html