演算法導論 第二章演算法基礎(1)插入排序

2021-09-02 09:55:34 字數 4031 閱讀 9892

輸入: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 分為排好序的和待排序的,每次取乙個待排序元素,找到插入的位置,插入已排好序的部分中。元素取完程式結束,...