ABAP 选择排序
【摘要】 在报表中,经常使用 SORT 关键字来进行排序,最近闲来无事,想着能不能利用 ABAP 来实现排序算法,所以就有了这篇选择排序的实现方式。 原理选择排序算法是一种简单的基于比较的排序算法。它将输入列表分为两部分:已排序部分和未排序部分。该算法反复从未排序的部分中查找最小元素,并将其放置在排序部分的开头。重复此过程,直到对整个列表进行排序。算法步骤:在列表的未排序部分查找最小元素将最小元素与未...
在报表中,经常使用 SORT
关键字来进行排序,最近闲来无事,想着能不能利用 ABAP 来实现排序算法,所以就有了这篇选择排序的实现方式。
原理
选择排序算法是一种简单的基于比较的排序算法。它将输入列表分为两部分:已排序部分和未排序部分。该算法反复从未排序的部分中查找最小元素,并将其放置在排序部分的开头。重复此过程,直到对整个列表进行排序。
算法步骤:
- 在列表的未排序部分查找最小元素
- 将最小元素与未排序零件的第一个元素交换
- 将已排序部件 1 元素的边界向右移动
- 重复步骤 1-3,直到对整个列表进行排序
伪代码:
procedure selectionSort(arr: array)
n := length(arr)
for i from 0 to n-1
minIndex := i
for j from i+1 to n-1
if arr[j] < arr[minIndex]
minIndex := j
swap(arr[i], arr[minIndex])
选择排序算法是使用嵌套循环实现的。外部循环循环遍历列表中的每个元素,从第一个元素到倒数第二个元素。内部循环通过将每个元素与当前最小元素进行比较,从列表的未排序部分查找最小元素。如果找到较小的元素,则其索引将存储为新的最小索引。内部循环完成后,最小元素与未排序部分的第一个元素交换。这会将已排序的第一部分元素的边界向右移动。重复该过程,直到对整个列表进行排序。
ABAP 实现
ABAP 程序没有 for 语句,因此需要通过 DO
语句来实现循环整个数组:
*&---------------------------------------------------------------------*
*& Report Y_SELECTION_SORT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT y_selection_sort.
DATA: lt_numbers TYPE TABLE OF i,
lv_temp TYPE i,
lv_min TYPE i,
lv_index TYPE i.
lt_numbers = VALUE #( ( 5 ) ( 2 ) ( 2013 ) ( 9 ) ( 1 ) ( 7 ) ).
DATA(len) = lines( lt_numbers ).
DO len TIMES.
DATA(min_index) = sy-index.
CLEAR lv_index.
lv_min = lt_numbers[ min_index ].
lv_index = sy-index + 1.
WHILE lv_index <= len.
IF lt_numbers[ lv_index ] < lv_min.
min_index = lv_index.
lv_min = lt_numbers[ min_index ].
ENDIF.
lv_index = lv_index + 1.
ENDWHILE.
lv_temp = lt_numbers[ sy-index ].
lt_numbers[ sy-index ] = lt_numbers[ min_index ].
lt_numbers[ min_index ] = lv_temp.
ENDDO.
LOOP AT lt_numbers INTO DATA(lv_number).
WRITE: / lv_number.
ENDLOOP.
优化,减少交换次数:
*&---------------------------------------------------------------------*
*& Report Y_SELECTION_SORT2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT y_selection_sort2.
TYPES : ty_array TYPE STANDARD TABLE OF i WITH EMPTY KEY.
DATA: i TYPE i VALUE 2,
j TYPE i VALUE 1,
key TYPE i,
n TYPE i.
DATA(array) = VALUE ty_array( ( 5 ) ( 3 ) ( 9 ) ( 7 ) ( 23 ) ( 18 ) ).
n = lines( array ).
PERFORM insertion_sort TABLES array .
FORM insertion_sort TABLES p_array TYPE STANDARD TABLE.
WHILE i LE n.
key = array[ i ].
j = i - 1.
" here i am using do loop instead of while (j>=1 AND a[j]>key)
" because a[j] will dump WHEN j becomes 0
DO j TIMES.
IF array[ j ] > key.
array[ j + 1 ] = array[ j ].
j = j - 1.
ENDIF.
ENDDO.
array[ j + 1 ] = key.
i = i + 1.
ENDWHILE.
LOOP AT array INTO DATA(ls_i).
WRITE : / ls_i.
ENDLOOP.
ENDFORM.
运行结果:
1
2
5
7
9
2,013
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)