直接插入排序
直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。
代码实现
1.Python
ARRAY = [20, 40, 30, 10, 60, 50]
for i in range(1, len(ARRAY)):
flag = False # 判断是否比最小的还要小,是的话将它插在0位置
for j in range(i - 1, -1, -1):
if ARRAY[j] < ARRAY[i]:
flag = True
break
if j != i - 1:
temp = ARRAY[i]
# 将比ARRAY[i]大的部分右移动
for k in range(i - 1, j - 1, -1):
ARRAY[k + 1] = ARRAY[k]
if flag:
ARRAY[k + 1] = temp
else:
ARRAY[0] = temp
print(ARRAY)
2.C语言
int i, j, k;
int a[6]={20, 40, 30, 10, 60, 50};
for (i = 1; i < n; i++)
{
//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
for (j = i - 1; j >= 0; j--)
if (a[j] < a[i])
break;
//如找到了一个合适的位置
if (j != i - 1)
{
//将比a[i]大的数据向后移
int temp = a[i];
for (k = i - 1; k > j; k--)
a[k + 1] = a[k];
//将a[i]放到正确位置上
a[k + 1] = temp;
}
}
3.汇编语言
STACK SEGMENT
DW 20 DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
ARRAY DW 20, 40, 30, 10, 60, 50
CRLF DB 0DH, 0AH, 24H
ELEMENT DW 0
FLAG DW 0
LEN DB ?
DATA ENDS
CODE SEGMENT
ASSUME SS:STACK, DS:DATA, CS:CODE
MAIN PROC FAR
MOV AX, STACK
MOV SS, AX
LEA SP, TOP
MOV AX, DATA
MOV DS, AX
MOV AX, DATA
MOV ES, AX
SORT:
LEA SI, ARRAY
MOV DI, SI
ADD DI, 2
SUB SI, 2
MOV FLAG, SI ;E用于存放数组的前一个地址,用来判断遍历结束
ADD SI, 2
XOR AX, AX ;AX用来存插入元素的地址
MOV CX,5 ;总循环次数
CONTINUE: MOV BX, [DI]
PUSH SI ;第一个数的位置压栈
COMPARE: CMP BX, [SI]
JA ADJUST
;小于就把AX的值存放当前要插入的位置
MOV AX, SI
SUB SI, 2
CMP SI, FLAG
JNE COMPARE
ADJUST: CMP AX, 0 ;判断AX是否又被修改过,没有说明当前数比前面的数大
JE CON
POP SI ;取出第一个数字的位置
;从AX到SI这一段的所有数字往后移动一个位置
XCHANGE: MOV DX, [SI]
XCHG DX, [SI+2]
;当SI表示的位置在AX前面了,说明移动完成
MOV BP, SI
SUB SI, 2
CMP AX, BP
JNE XCHANGE
MOV SI, AX
MOV [SI], BX
CON: ADD DI, 2 ;继续下一次
MOV SI, DI
SUB SI, 2
XOR AX, AX ;同时需要清空AX
CALL PRINT
LOOP CONTINUE
EXIT: MOV AH, 4CH
INT 21H
MAIN ENDP
;打印
PRINT PROC NEAR
PUSH SI
PUSH CX
PUSH AX
PUSH DX
LEA DX, CRLF
MOV AH, 9
INT 21H
LEA SI, ARRAY
MOV CX, 6
L1: MOV AX, [SI]
MOV ELEMENT, AX
CALL OUTPUT
ADD SI, 2
MOV DX, 20H
MOV AH, 2
INT 21H
LOOP L1
POP DX
POP AX
POP CX
POP SI
RET
PRINT ENDP
OUTPUT PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR CX, CX
MOV AX, ELEMENT
MOV BX, 10
L2: XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE L2
L3: POP DX
ADD DX, 30H
MOV AH, 2
INT 21H
LOOP L3
POP DX
POP CX
POP BX
POP AX
RET
OUTPUT ENDP
CODE ENDS
END MAIN