ABAP 选择排序

举报
雨绸缪 发表于 2023/10/30 16:14:03 2023/10/30
【摘要】 在报表中,经常使用 SORT 关键字来进行排序,最近闲来无事,想着能不能利用 ABAP 来实现排序算法,所以就有了这篇选择排序的实现方式。 原理选择排序算法是一种简单的基于比较的排序算法。它将输入列表分为两部分:已排序部分和未排序部分。该算法反复从未排序的部分中查找最小元素,并将其放置在排序部分的开头。重复此过程,直到对整个列表进行排序。算法步骤:在列表的未排序部分查找最小元素将最小元素与未...

在报表中,经常使用 SORT 关键字来进行排序,最近闲来无事,想着能不能利用 ABAP 来实现排序算法,所以就有了这篇选择排序的实现方式。

原理

选择排序算法是一种简单的基于比较的排序算法。它将输入列表分为两部分:已排序部分和未排序部分。该算法反复从未排序的部分中查找最小元素,并将其放置在排序部分的开头。重复此过程,直到对整个列表进行排序。

算法步骤:

  1. 在列表的未排序部分查找最小元素
  2. 将最小元素与未排序零件的第一个元素交换
  3. 将已排序部件 1 元素的边界向右移动
  4. 重复步骤 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。