排序演算法之直接插入排序

2021-09-24 09:52:05 字數 3216 閱讀 2331

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

for (i = 1; i < n; i++)

}

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

retprint 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

retoutput endp

code ends

end main

排序演算法 插入排序之直接插入排序

直接插入排序的核心思想是把乙個記錄插入乙個有序序列中,每插入乙個記錄就得到乙個新的有序序列,直到所有記錄都插入成功,得到有序序列。每次插入記錄時的有序序列如何得到,關鍵在第一次,第一次要插入的記錄時序列的第二個值,有序序列只有乙個值,就是第乙個記錄。a j 1 x j 1就是要插入的位置 print...

排序演算法之直接插入排序

直接插入排序 straight insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。設陣列為a 0 n 1 其中紅色區域為有序區域 1.初始時,a 0 自成1個有序區,無序區為a 1.n 1 a 0 a ...

排序演算法之直接插入排序

直接插入排序類似於我們平常在打撲克摸牌時候的一種情形。我習慣於左手拿牌右手摸牌,每次先把左手中的牌齊整齊,然後右手新摸一張牌中把它放到左手中正確的位置,讓它成為乙個新的整齊的牌堆。如果根據上面的思路我們可以發現,直接插入排序的思想就是,從需要排序的第二個數字開始,拿取乙個數,與前面的數字進行比較,放...