排序算法之选择排序

释放双眼,带上耳机,听听看~!

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。
它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  流程如图所示

排序算法之选择排序

排序流程

第1趟:i=0。找出a[1…5]中的最小值a[3]=10,然后将a[0]和a[3]互换。 数列变化:20,40,30,10,60,50 — > 10,40,30,20,60,50
第2趟:i=1。找出a[2…5]中的最小值a[3]=20,然后将a[1]和a[3]互换。 数列变化:10,40,30,20,60,50 — > 10,20,30,40,60,50
第3趟:i=2。找出a[3…5]中的最小值,由于该最小值大于a[2],该趟不做任何处理。 
第4趟:i=3。找出a[4…5]中的最小值,由于该最小值大于a[3],该趟不做任何处理。 
第5趟:i=4。交换a[4]和a[5]的数据。 数列变化:10,20,30,40,60,50 — > 10,20,30,40,50,60

代码实现:

1.Python实现


1
2
3
4
5
6
7
8
9
10
11
1ARRAY = [20, 40, 30, 10, 60, 50]
2for i in range(len(ARRAY) - 1):
3
4    for j in range(i + 1, len(ARRAY)):
5        if ARRAY[j] < ARRAY[i]:
6            temp = ARRAY[j]
7            ARRAY[j] = ARRAY[i]
8            ARRAY[i] = temp
9    print(ARRAY)
10
11

2.C语言实现


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1 int i;        // 有序区的末尾位置
2    int j;        // 无序区的起始位置
3    int min;    // 无序区中最小元素位置
4    int a[6]={20, 40, 30, 10, 60, 50}
5    for(i=0; i<n; i++)
6    {
7        min=i;
8
9        // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
10        for(j=i+1; j<n; j++)
11        {
12            if(a[j] < a[min])
13                min=j;
14        }
15
16        // 若min!=i,则交换 a[i] 和 a[min]。
17        // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
18        if(min != i)
19            swap(a[i], a[min]);
20    }
21

 

3.汇编实现


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
1DATAS SEGMENT
2    ARRAY DB 20, 40, 30, 10, 60, 50
3    NUM EQU $-ARRAY  
4    NEWSPACE DB '  ','$'
5DATAS ENDS
6
7STACKS SEGMENT
8    
9    DW 40H DUP(?)
10    TOP LABEL WORD
11STACKS ENDS
12
13CODES SEGMENT
14    ASSUME CS:CODES,DS:DATAS,SS:STACKS
15START:
16    MOV AX,DATAS
17    MOV DS,AX
18    MOV AX,STACKS
19    MOV SS,AX
20    LEA SP,TOP
21    MOV CX,NUM
22    LEA BX,ARRAY
23    MOV SI,0
24    MOV DI,0
25    DEC CX ;需要对比几趟
26OUTTER:
27  PUSH CX;保存外层第几趟
28  MOV AH,[BX+SI];前后俩数大小
29  MOV DI,SI
30  INC DI
31 
32INNER:
33 
34 
35  MOV AL,[BX+DI];前后俩数大小
36  CMP AL,AH;前后俩数大小
37  JB XCHANGE;前者大于后者则交换位置
38NEXT:
39 
40  INC DI
41  LOOP INNER
42  INC SI
43  POP CX
44  LOOP OUTTER
45  JMP EXIT
46
47XCHANGE:
48    ;交换位置
49 
50  MOV [BX+SI],AL
51  MOV [BX+DI],AH
52  JMP NEXT
53    
54    
55EXIT:
56  MOV CX,NUM
57  MOV SI,0
58  PRINTF:
59      XOR AX,AX
60      PUSH CX
61      MOV AL,ARRAY[SI]
62      INC SI
63      MOV CX,0
64      PUSHIN:
65          XOR DX,DX
66          MOV BX,10
67          DIV BX
68          PUSH DX
69          INC CX
70          CMP AX,0
71          JNE PUSHIN
72      POPOUT:
73          POP DX
74          ADD DL,30H
75          MOV AH,2H
76          INT 21H
77
78          LOOP POPOUT
79     
80      POP CX
81      LEA DX,NEWSPACE
82      MOV AH,9H
83      INT 21H
84      LOOP PRINTF
85 
86    MOV AH,4CH
87    INT 21H
88CODES ENDS
89    END START
90
91
92
93
94
95
96

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

基于spring boot和mongodb打造一套完整的权限架构(二)【MAVEN依赖以及相应配置】

2021-12-11 11:36:11

安全运维

Ubuntu上NFS的安装配置

2021-12-19 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索