輸入:n個數的乙個序列
\。輸出:輸入序列的乙個排序
\, 滿足 a1′
≤a2′
≤⋯≤a
n′
a^\prime_1 \le a^\prime_2 \le \cdots \le a^\prime_n
a1′≤a
2′≤
⋯≤an
′。插入排序原址排序輸入的數,演算法在陣列a
aa中重排這些數,在任何時候,最多只有其中的常數個數字儲存在陣列外面。
for j = 2 to a.length
key = a[j]
i = j - 1
while(i > 0 and a [i] > key)
a[i + 1] = a[i]
i = i - 1
a[i + 1] = key
# -*- coding:utf-8 -*-
# 插入排序(降序)
# input:
# output:
import random
definsertionsort
(array)
:for i in
range
(len
(array)-2
,-1,
-1):
key = array[i]
j = i +
1while j <
len(array)
and array[j]
> key:
array[j -1]
= array[j]
j = j +
1 array[j -1]
= key
if __name__ ==
"__main__"
: array = random.sample(
[x for x in
range
(100)]
,20)print
("before: "
, array)
insertionsort(array)
print
("end: "
, array)
迴圈不變式定義
插入排序的迴圈不變式
# -*- coding:utf-8 -*-
definsertionsort
(array)
:for i in
range(1
,len
(array)):
key = array[i]
j = i -
1while j >=
0and array[j]
> key:
array[j+1]
= array[j]
j = j -
1 array[j +1]
= key
print
(array)
if __name__ ==
"__main__"
: array =[31
,41,59
,26,41
,58] insertionsort(array)
# -*- coding:utf-8 -*-
# 插入排序 (公升序)
# input:
# output:
import random
definsertionsort
(array)
:for i in
range(1
,len
(array)):
key = array[i]
j = i -
1while j >=
0and array[j]
> key:
array[j+1]
= array[j]
j = j -
1 array[j +1]
= key
if __name__ ==
"__main__"
: array = random.sample(
[x for x in
range
(100)]
,20)print
("before: "
, array)
insertionsort(array)
print
("end: "
, array)
輸入:n
nn個數的乙個序列a
=a=\
a=和乙個值vvv。
輸出:下標i
ii使得v=a
[i
]v=a[i]
v=a[i]
或者當v
vv不在a
aa中出現時,v
vv為特殊值nil
nilni
l。偽**:find-key(a, v)
for i = 1 to a.length
if a[i] == v
return i
return nil
迴圈不變式:對於每次迴圈迭代,子陣列(已遍歷的元素)中沒有與v
vv相等的值。
初始化:第一次迴圈之前,子陣列沒有元素,其中肯定沒有與v
vv相等的值,迴圈不變式成立。
保持:每次迭代都將比較a[i
]a[i]
a[i]
與v
vv的值,如果相等,迴圈終止;如果不等,a[1
]…a[
i]
a[1] \dots a[i]
a[1]…a
[i]中沒有與v
vv相等的值,迴圈不變式保持。
終止:當i
>a.
leng
th
i > a.length
i>a.
leng
th時或者a[i
]==v
a[i] == v
a[i]==
v 時迴圈終止。顯然對於子陣列即下標小於i
ii的所有元素均沒有與v
vv相等的值,演算法正確。
a,b各存放了乙個二進位制n位整數的各位數值,現在通過二進位制的加法對其進行計算,結果以二進位制的形式把各位上的數值存放在c陣列中。
# -*- coding:utf-8 -*-
defbinarysum
(aarray, barray)
: c =[0
]*(len
(aarray)+1
)for i in
range
(len
(aarray)-1
,-1,
-1):
if((a[i]
+ b[i]
+ c[i +1]
)>1)
: c[i]=1
c[i +1]
= c[i +1]
^ a[i]
^ b[i]
return c
if __name__ ==
"__main__"
: a =[1
,0,1
,1,0
,1,0
,1,1
,1] b =[0
,1,1
,1,0
,0,1
,1,0
,1]#100 1010 0100
c = binarysum(a, b)
print
(c)
演算法導論(平話)第二章演算法基礎 插入排序
前言 對於作者這類學術很渣,算導簡直就是一本晦澀難懂的書,作者根據自己的有限的理解對每一章節做平話描述。插入排序 元素 序列 引數 原址 迭代 偽 此文不做專業名詞的闡述,意在幫助很多初次接觸的程式設計師用白話的方式理解插入排序。1.白話概念 從一堆東西中 可以是任何物質 乙個個取出,邊取邊按照一定...
演算法導論第二章
插入排序原始碼 1 include 2 include 3 4using namespace std 56 void insert sort inta 7 17 a i 1 key 18 19 2021 intmain 22view code 逆序輸出 1 include 2 include 3 4...
演算法導論 第二章 插入排序
1.插入排序類似於整理撲克牌 排列好順序的撲克和待排序的撲克 2.插入排序 insertion sort 引數是乙個陣列a 1.n 共n個數,輸入的各個數字原地排序 sorted in place 分為排好序的和待排序的,每次取乙個待排序元素,找到插入的位置,插入已排好序的部分中。元素取完程式結束,...