从今天开始,给大家介绍各种算法,立志一天介绍一种算法,今天就先给大家介绍排序算法,采用python,C,汇编三种语言分别给大家做说明
冒泡排序的定义:
冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。
它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!
算法过程如图所示
z
我们先分析下第一趟,i=5:
当j=0时,a[0]<a[1]。此时,不做任何处理!
当j=1时,a[1]>a[2]。此时,交换a[1]和a[2]的值;交换之后,a[1]=30,a[2]=40。
当j=2时,a[2]>a[3]。此时,交换a[2]和a[3]的值;交换之后,a[2]=10,a[3]=40。
当j=3时,a[3]<a[4]。此时,不做任何处理!
当j=4时,a[4]>a[5]。此时,交换a[4]和a[5]的值;交换之后,a[4]=50,a[3]=60。
第一趟下来后a[5]是最大的;
第二趟i=4,我们只需要分析a[0....4],结束后数列中a[4,5]是有序的。
第三趟i= 3我们只需要分析a[0....3],结束后数列中a[3,4,5]是有序的。
第四趟i =2我们只需要分析a[0....2],结束后数列中a[2,3,4,5]是有序的。
第五趟i = 1我们只需要分析a[0....1],结束后数列中a[0,1,2,3,4,5]是有序的。
实现代码:
1.Python实现:
ARRAY = [20, 40, 30, 10, 60, 50]
for i in range(len(ARRAY) - 1, 0, -1):
for j in range(0, i):
if ARRAY[j] > ARRAY[j + 1]:
flag = ARRAY[j]
ARRAY[j] = ARRAY[j + 1]
ARRAY[j + 1] = flag
2.C语言
int i,j;
int array[6]={20, 40, 30, 10, 60, 50}
for (i=n-1; i>0; i--)
{
// 将array[0...i]中最大的数据放在末尾
for (j=0; j<i; j++)
{
if (array[j] > array[j+1])
swap(array[j], array[j+1]);
}
}
3.汇编语言实现
DATAS SEGMENT
ARRAY DB 20, 40, 30, 10, 60, 50
NUM EQU $-ARRAY
NEWSPACE DB ' ','$'
DATAS ENDS
STACKS SEGMENT
DW 40H DUP(?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
MOV CX,NUM
LEA BX,ARRAY
MOV SI,0
MOV DI,0
DEC CX ;需要对比几趟
OUTTER:
PUSH CX;保存外层第几趟
MOV DI,0
INNER:
MOV AL,[BX+DI];前后俩数大小
MOV AH,[BX+DI+1];前后俩数大小
CMP AL,AH;前后俩数大小
JA XCHANGE;前者大于后者则交换位置
NEXT:
INC DI
LOOP INNER
POP CX
LOOP OUTTER
JMP EXIT
XCHANGE:
;交换位置
XCHG AL,AH
MOV [BX+DI],AL
MOV [BX+DI+1],AH
JMP NEXT
EXIT:
MOV CX,NUM
MOV SI,0
PRINTF:
XOR AX,AX
PUSH CX
MOV AL,ARRAY[SI]
INC SI
MOV CX,0
PUSHIN:
XOR DX,DX
MOV BX,10
DIV BX
PUSH DX
INC CX
CMP AX,0
JNE PUSHIN
POPOUT:
POP DX
ADD DL,30H
MOV AH,2H
INT 21H
LOOP POPOUT
POP CX
LEA DX,NEWSPACE
MOV AH,9H
INT 21H
LOOP PRINTF
MOV AH,4CH
INT 21H
CODES ENDS
END START