冒泡排序图解

未命名白板

冒泡排序程序流程图

BubbleSort程序流程图

汇编语言代码实现

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
data segment
count db 5
array label byte
db 1,2,3,4,5
data ends
code segment
assume ds:data,cs:code
start:
mov dx,data
mov ds,dx
mov ch,[count] ;设置数组长度
mov ah,0ffh ;设置退出标志位不要直接退出
next2:
cmp ah,00h
jz exit
dec ch ;循环次数n-1次
jz exit
mov cl,ch ;内层循环次数等于外层循环剩余次数
lea bx,array ;bx指针归位
mov ah,00h ;提前退出标志归位
next3:
mov al,[bx]
cmp al,1[bx]
jae next1
xchg al,1[bx]
mov [bx],al
mov ah,0ffh
next1:
inc bx
dec cl
jz next2
jmp next3
exit:
call breakPoint
mov ah,4ch
int 21h

breakPoint:
push bx ;bx压栈,保护起来
pushf ;psw压栈
pop bx ;上一条保存的psw内容弹出到bx
or bh,3 ;TF、IF置1,开中断,单步调试
push bx ;bx压栈
popf ;上一条压栈的bx内容弹出到psw
pop bx ;最开始压栈的bx弹出,恢复数据
ret
code ends
end start

c语言代码实现

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
#include<stdio.h>
int main(){
int array[10],t;
for(int i=0;i<10;i++){
scanf("%d",&array[i]);
}
/* 十个数需要进行九轮排序,每轮排序可以找出
最大的一个数字放到数组的末尾
*/
for(int i=0;i<9;i++){
/*第一轮排序需要把十个数字依次比较,
找出最大的数放到最后
第二轮排序需要把九个数字依次比较,
因为最大的数已经放到了最后
依次类推,第n轮排序只需要比较数字个数-n个数字
*/
for(int j=0;j<10-i-1;j++){
/*
一共要比10-i个数字,第一个数字的下标是0,
最后一个数字的下标是10-i-1
*/
if(array[j]>array[j+1]){
t = array[j+1];
array[j+1]=array[j];
array[j]=t;
}
}
}
printf("排序完毕:");
for(int i=0;i<10;i++){
printf("%d ",array[i]);
}
putchar('\n');

return 0;
}

选择排序图解

image-20220930163754000

c语言实现代码

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
#include<stdio.h>
int main(){
int array[10],t;
for(int i=0;i<10;i++)
scanf("%d",&array[i]);
/*
每次排序能找出一个最大的数放到前面,
把含有n个数的数组排序完毕需要 n-1轮
*/
for(int i=1;i<10;i++){
/*
第一轮排序需要把第一个数与最大数互换,
第二轮排序需要把第二个数与最大数互换,
以此类推...
*/
for(int j=i;j<10;j++){
if(array[i-1]<array[j]){
t=array[j];
array[j]=array[i-1];
array[i-1]=t;
}
}
}
printf("排序完毕:");
for(int i=0;i<10;i++){
printf("%d ",array[i]);
}
return 0;
}