資料結構和演算法 排序演算法day1

2021-09-16 13:22:58 字數 4053 閱讀 3537

排序演算法的執行效率

1)、時間複雜度的最好,最壞,平均情況

2)、時間複雜度的係數,常數,低階

3)、比較次數和交換次數

2、排序演算法的記憶體消耗

我們可以通過空間複雜度來衡量

排序演算法的穩定性

穩定性就是經過排序之後,相等的元素的先後順序不改變

這裡只些一些常用的排序演算法如:氣泡排序、插入排序、希爾排序、選擇排序、歸併排序、快速排序、計數排序、基數排序、桶排序。

氣泡排序原理

比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

針對所有的元素重複以上的步驟,除了最後已經選出的元素(有序)。

持續每次對越來越少的元素(無序元素)重複上面的步驟,直到沒有任何一對數字需要比較,則序列最終有序。

**實現:

data = [1,3,2,6,4,5]

len_list = len(data)

for i in range(len_list):

for j in range(len_list-i-1):

if data[j] > data[j+1]:

data[j], data[j+1] = data[j+1], data[j]

**優化:

如果冒泡操作已經沒有資料交換時,說明已經達到完全有序,不用再執行冒泡操作

data = [1,3,2,6,4,5]
len_list = len(data)

for i in range(len_list):

count = 0

for j in range(len_list-i-1):

if data[j] > data[j+1]:

count += 1

data[j+1],data[j] = data[j],data[j+1]

if count == 0:

break

氣泡排序分析:

空間複雜度:氣泡排序只涉及相鄰資料交換,所以空間複雜度為o(1)

穩定性:氣泡排序,如果相鄰資料大小相等我們不會對其進行交換,所以相同大小的資料在排序前後不會改變順序,所有氣泡排序是穩定的排序演算法

時間複雜度:最好的情況,資料已經是有序的進行一次冒泡操作即可。所以最好時間複雜度為o(n)

最壞的情況是資料為逆序,需要進行n次冒泡操作所以最壞時間複雜度為o(n^2)

插入排序原理

將陣列分為已排序區間和未排序區間,初始狀態是將陣列第乙個原素放在已排序空間,然後再未排序空間取出資料按順序插入已排序空間。

**實現

#encoding:utf-8

def charu(lis):

for i in range(1,len(lis)):

j = i-1

value = lis[i]

while j >=0:

if value < lis[j]:

lis[j+1] = lis[j]

lis[j] = value

j = j - 1

分析

空間複雜度:插入排序屬於原地排序演算法,所以其空間複雜度為o(1)

是否穩定:在插入時如果遇到值相同的資料,我們可以選擇按先後順序排序。這樣插入排序就屬於穩定的排序演算法

時間複雜度:

最好時間複雜度:每次插入時只對比一次,就能確定插入位置,時間複雜度為o(n),

最壞時間複雜度:每次插入都要插入到陣列的第乙個位置,時間複雜度為o(n)

平均時間複雜度:在陣列中插入資料的平均時間複雜度為o(n),需要執行n次插入操作。所以插入排序的平均時間複雜度為o(n^2)

希爾排序原理:

先將待排序元素序列分割成多個子串行,然後再分別進行插入排序,然後依次縮小子串行個數,再進行排序。

**:

#encoding:utf-8

def xier(lis):

num = len(lis)//2

while num > 0:

for i in range(num,len(lis)):

j = i - num

value = lis[i]

while j >= 0:

if value < lis[j]:

lis[j+num],lis[j] = lis[j],value

j -= num

num //= 2

分析:

空間複雜度:o(1)

時間複雜度:最優時間複雜度為o(nlogn)

最壞時間複雜度為o(n^2)

是否穩定:不穩定

資料結構和演算法 Day 1

資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。程式設計 資料結構 演算法 簡單來說,資料結構研究的是一種關係,就是資料元素相互之間存在的一種或多種特定關係的集合。傳統上,資料結構分為邏輯結構和物理結構 邏輯結構是指資料物件中的資料元素之間的相互關係...

資料結構和演算法 day1

這是計算機必修課,很搞腦子,但要讓程式設計能力有質的飛躍,而不是簡單呼叫各種現成api去實現各種功能,卻不懂內部原理,就必須學習這門課,自己設計結構和演算法。3.資料結構和演算法為什麼要一起學?二 資料結構分為邏輯結構和物理結構 三 程式 資料結構 演算法 演算法是解決特定問題的步驟描述,表現為有限...

排序演算法Day1

include mysort.h include include include include include include include using namespace std 插入排序 時間複雜度 平均哦o n 2 完全有序時o n 空間複雜度o 1 穩定 思想 把待排序列分為有序序列和無...