資料結構與演算法 學習筆記(3) 表反轉與插入排序

2021-09-12 01:29:45 字數 2586 閱讀 3797

本次文章,介紹了線性表中順序表和煉表的反轉和插入排序操作。

1.順序表反轉

這個比較簡單,就是把前後元素互換,然後第二和倒二元素互換,依次類推

def

reverse

(self):

elems = self.elements

i, j = 0, len(elems)-1

while i < j:

elem[i], elem[j] = elem[j], elem[i]

i, j = i+1, j-1

2.鍊錶反轉

思路:初始化逆序表,每次摘下原表表頭,並將表頭指標後移,然後用結點current_node儲存摘下的結點,放在逆序表表頭。將p指向current_node,即逆序表表頭。

def

rev(self):

p = none

while self.head: #依次摘下所有結點

current_node = self.head

self.head = current_node.next #摘下原來的首結點

current_node.next = p 

p = current_node #將摘下的結點加入p引用的結點序列

self.head = p #重置表頭鏈結

3.順序表的插入排序

思路:兩層迴圈

外迴圈: 從第二個元素(下標1)開始,用臨時變數x儲存當前下標對應的elem,方便內迴圈比較操作,直到表末。

內迴圈: 如果發現當前的x.elem小於前一位的elem,則將前一位的elem賦值給當前位置的x.elem,然後向前繼續判斷,如果前二位位置的值大於x.elem,就將其賦值給其後一位,依次類推,直到x.elem小於等於某一位置的elem,退出內迴圈,將其值插入(賦值)給那個位置。外迴圈將當前位置後移一位,再進入內迴圈。

注意:由於外迴圈從第二位開始,每次都經歷了內迴圈的部分,所以當外迴圈變數增加到i時,lst[0]到lst[i-1]是已排好序的。

#順序表的插入排序

deflist_sort

(lst):

for i in range(1,len(lst)): #外迴圈

x = lst[i] # 用乙個臨時變數儲存位置i的值

j = i #方便比較操作

while j > 0

and lst[j-1] > x: #當x大於其前面的值時,把前面的值依次向後搬移。

lst[j] = lst[j-1]

j = j-1

lst[j] = x # 最後將 x插入到位置j,完成排序

4.鍊錶插入排序思路主線:

將原始鍊錶分為兩個鍊錶,用兩個指標p和rem指向鍊錶的表頭,每次把p中的元素從左到右依次和rem表的第乙個結點比較,如果p.elem<=rem.elem,用q指向p,並把p右移(不能移出鍊錶的尾部),這樣q永遠在p的前一位,當遇到p.elem>rem.elem時,需要把rem結點從rem所在鍊錶中刪除下來,接到q的後面(且在p的前面)。遇到特殊情況,比如rem需要放在表頭,此時q為none,則需稍微修改(體現在if語句中)。

#鍊錶插入排序

defsort

(self):

p = self.head

if p is

none

or p.next is

none:

return

rem = p.next #定義rem為鍊錶

p.next = none

#拆分鍊錶成為兩個鍊錶,新錶p用來存放排序好的結點,第二個表rem存放未排序好的結點(舊表後面部分)

while rem is

notnone: #將以rem為表頭的鍊錶,乙個乙個結點推出

p = self.head #令每次迴圈時,p都始終首先指向新錶的表頭

q = none

#q為p的前乙個結點,由於此時p為表頭,那麼q為none

# 比較p結點元素和rem結點元素的大小,當p

while p.elem <= rem.elem and p is

notnone: 

q = p #用q來跟蹤p

p = p.next #然後把p向右移,這樣的話 q永遠在p的前乙個結點,方便把rem插入到q和p之間

if q is

none: #處理表頭插入,比如初始鍊錶元素為2134這樣的鍊錶,1需要插入到2的前面,此時的q=none

self.head = rem

else:  #不是表頭插入的話,正常操作就行

q.next = rem #把rem結點鏈結到q結點後一位,因為此時q為新表表頭

rem = rem.next #1 #把rem表的表頭向後一位

q.next.next = p #2 把p結點鏈結到rem結點後一位,也就是q結點的後兩位

#為了避免在「#2」中用兩個next,也可以用q指向rem,再用q.next=p,替換「#1、#2」語句,例如:

# q = rem 

# rem = rem.next

# q.next = p

資料結構與演算法學習筆記3

最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 例 在乙個無序的陣列 array 中,查詢變數 x 出現的位置。如果沒有找到,就返回 1 n表示陣列array的長度 intfind int array,int n,int x return pos 時間複雜度 o n nn...

《大話資料結構》資料結構與演算法學習筆記3

演算法複雜度 設問題的輸入規模為n,判斷乙個演算法的效率時,函式中的常數和其他次要項通常可以忽略,而應該更加關注主項 最高端項 的階數。就是和數學分析裡判斷兩個函式高低階的思路一樣。如果規範一下說法,就是演算法時間複雜度 演算法時間複雜度 定義 在進行演算法分析時,語句總的執行次數t n 是關於問題...

資料結構與演算法學習筆記

演算法基礎篇 第一章 演算法概述 首先了解一下基本的概念 1.1 什麼是演算法呢?從字面意義上理解,演算法就是用於計算的方法,用這種方法達到預期的結果。通俗的講,演算法可以理解為乙個完整的解題步驟,由一些基本的運算和規定的運算順序組成。通過這樣的解題步驟可以解決特定的問題。演算法可以抽象出5個特徵 ...