本次文章,介紹了線性表中順序表和煉表的反轉和插入排序操作。
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個特徵 ...