不用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_DATA25 *&---------------------------------------------------------------------*26 * 随机产生10个 -100 到100 之间不重复的数27 *----------------------------------------------------------------------*28 * --> p1 text29 * <-- p2 a30 *----------------------------------------------------------------------*31 FORM frm_full_data.32 DATA:lv_len TYPE i.33 WHILE lv_len < 10.34 * 随机产生一个数35 CALL FUNCTION 'QF05_RANDOM_INTEGER'36 EXPORTING37 ran_int_max = 10038 ran_int_min = -10039 IMPORTING40 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_DATA48 *&---------------------------------------------------------------------*49 *& Form FRM_SORT50 *&---------------------------------------------------------------------*51 * 开始排序52 *----------------------------------------------------------------------*53 * --> p1 text54 * <-- p2 a55 *----------------------------------------------------------------------*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 a60 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_SORT66 67 *&---------------------------------------------------------------------*68 *& Form frm_min69 *&---------------------------------------------------------------------*70 * 找出t_a 中最小的数 p_n71 *----------------------------------------------------------------------*72 * --> p1 t_a73 * <-- p2 p_n74 *----------------------------------------------------------------------*75 FORM frm_get_min TABLES t_a LIKE b76 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_min85 *&---------------------------------------------------------------------*86 *& Form FRM_SHOW_DATA87 *&---------------------------------------------------------------------*88 * text89 *----------------------------------------------------------------------*90 * --> p1 text91 * <-- p2 text92 *----------------------------------------------------------------------*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
运行效果如图: