算法(Algorthm):一個計算過程,解決問題的方法。算法
時間複雜度是用來估計算法運行時間的一個式子(單位)。M個循環,複雜度就是N的M次方。(例如2個for循環,時間複雜度就是N的平方)優化
空間複雜度是用來評估算法佔用內存大小的一個式子。ui
(1)列表排序:將無序的列表變成有序列表。排序
應用場景:各類榜單、各類表單、給二分排序用、給其餘算法用遞歸
A、冒泡排序內存
思路:相鄰的兩個數兩兩對比,若是前面的數大於後面的數,則把前面的數和後面的交換。每一輪排序,最大的數置於最後。it
def bubble_sort(li):io
for i in range(len(li) -1):for循環
exchange = False #加個優化表單
for j in range(len(li) -i -1):
if li[ j ] > li[ j+1 ]:
li[ j ],li [ j+1 ] = li [ j+1 ],li[ j ]
exchange = True #加個優化
if not exchange:
return #加個優化,若是冒泡排序中執行一趟而沒有交換,則表示列表已是有序狀態,能夠直接結束算法
B、選擇排序
思路:一趟遍歷記錄最小的數,放到第一個位置;再一趟遍歷記錄剩餘列表中最小的數,繼續放置。
for select_sort(li):
for i in range(len(li) -1):
min_loc = i
for j in range(i+1,len(li)):
if li[ j ] < li[ min_loc ]:
min_loc = j
if min_loc != i:
li[ i ],li[ min_loc ] = li[ min_loc],li[ i ]
C、插入排序
思路:列表被分爲有序區和無序區兩個部分,最初有序區只有一個元素;每次從無序區選擇一個元素,插入到有序區的位置,直到無序區變空。
def insert_sort(li):
for i in range(1,len(li)): #從1開始排序(注意:下標是從0開始)
tmp = li[ i ]
j = i -1
while j >= 0 and tmp < li[ j ]:
li[ j +1 ] = li[ j ]
j = j - 1
li[ j+1 ] = tmp
D、快速排序
思路:取一個元素P(第一個元素),使P歸位;
列表被P分紅兩部分,左邊都比P小,右邊都比P大;
遞歸完成排序。
def quick_sort(data,left,right): #遞歸
if left < right:
mid = partition(data,left,right)
quick_sort(data,left,mid-1)
quick_sort(data,mid+1,right)
def partition(data,left,right): #使元素歸位
tmp = data[left]
while left < right:
while left < right and data[right] >=tmp:
right -= 1
data[left] = data[right]
while left < right and data[left] <=tmp:
left +=1
data[right] = data[left]
data[left] = tmp
return left