排序算法之直接插入排序

直接插入排序是一种简单直观的排序算法,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。本文介绍了直接插入排序的基本思想,并提供了Python、C语言和汇编语言的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 直接插入排序

直接插入排序(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值