以此類推,使最大的數沉底,再從頭開始比較,最終完成排序
**:
def
bubble_sort
(li)
:for i in
range
(len
(li)-1
):for j in
range
(len
(li)
-i-1):
if li[j]
> li[j+1]
: li[j]
, li[j+1]
= li[j+1]
, li[j]
# 時間複雜度為o(n**2)
如果氣泡排序中執行一趟而沒有交換,則列表已經是有序狀態,可以直接結束演算法。
def
bubble_sort_1
(li)
:for i in
range
(len
(li)-1
):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
ifnot exchange:
return
演算法思想:一趟遍歷記錄最小的數,放到第乙個位置;再一趟遍歷記錄剩餘列表中最小的數,繼續放置;
直到完成排序。
**:def
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]
# 時間複雜度為o(n**2)
演算法思想:列表被分為有序區和無序區兩個部分。最初有序區只有乙個元素。
每次從無序區選擇乙個元素,插入到有序區的位置,直到無序區變空。
**:def
insert_sort
(li)
:for i in
range(1
,len
(li)):
tmp = li[i]
j = i -
1while j >=
0and tmp < li[j]
: li[j +1]
= li[j]
j = j -
1 li[j +1]
= tmp
# 時間複雜度為o(n**2)
快排演算法方便快捷,既好寫,執行速度又快,可以大大提高執行效率
演算法思路:
1,取乙個元素p(第乙個元素),使元素p歸位;
, 2,列表被p分成兩部分,左邊都比p小,右邊都比p大;
3,遞迴完成排序。
**:#第一步:
defquick_sort
(data, left, right)
:if left < right:
mid = partition(data, left, right)
quick_sort(data, left, mid -1)
quick_sort(data, mid +
1, right)
# 第二步:
defpartition
(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
使用二叉樹完成的排序。
演算法思路:
1,建立堆
2,得到堆頂元素,為最大元素
3,去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過一次調整重新使堆有序。
4,堆頂元素為第二大元素。
5,重複步驟3,直到堆變空。
**:def
sift
(data, low, high)
: i = low
j =2* i +
1 tmp = data[i]
while j <= high:
if j < high and data[j]
< data[j +1]
: j +=
1if tmp < data[j]
: data[i]
= data[j]
i = j
j =2* i +
1else
:break
data[i]
= tmp
defheap_sort
(data)
: n =
len(data)
for i in
range
(n //2-
1,-1
,-1)
: sift(data, i, n -1)
for i in
range
(n -1,
-1,-
1): data[0]
, data[i]
= data[i]
, data[0]
sift(data,
0, i -
1)
演算法思路:
1,分解,把列表越分越小,直至分為乙個元素。單個元素是有序的。
2,將有序的列表兩兩歸併,列表越來越大,
**:def
merge
(li, low, mid, high)
: i = low
j = mid +
1 ltmp =
while i <= mid and j <= high:
if li[i]
<= li[j]:)
i +=
1else:)
j +=
1while i <= mid:
) i +=
1while j <= high:
) j +=
1 li[low:high +1]
= ltmp
defmergesort
(li, low, high)
:if low < high:
mid =
(low + high)//2
mergesort(li, low, mid)
mergesort(li, mid +
1, high)
merge(li, low, mid, high)
# 時間複雜度:o(nlogn)
# 空間複雜度:o(n)
三種排序演算法的時間複雜度都是o(nlogn)
一般情況下,就執行時間而言:
快速排序 < 歸併排序 < 堆排序
三種排序演算法的缺點:快速排序:極端情況下排序效率低
歸併排序:需要額外的記憶體開銷
堆排序:在快的排序演算法中相對較慢
索引演算法概覽
索引技術是通過有結構 無結構的資料以一定規則儲存在相應介質上,並同時提供一種訪問方式的技術。從定義中可以看出,索引技術的核心是關於如何儲存與訪問資訊,當在實際問題中面臨選擇何種索引技術或工具時,首先需要了解資料量的大小 資料的格式,是即時訪問還是批量查詢等等,有時還需要結合儲存介質,比如是否使用快取...
十大排序演算法整理(一) 概覽
十大排序演算法分類 特點和關係 1 氣泡排序 交換排序的一種 2 選擇排序 3 插入排序 4 歸併排序 採用了分治思想,額外的空間複雜度o n 容易記錯,最後合併大陣列的時候需要開闢乙個長度為n的陣列 5 快速排序 採用了分治思想,交換排序的一種,額外的空間複雜度o nlogn 容易記錯 6 堆排序...
《演算法導論》筆記 動態規劃概覽
什麼問題適合使用動態規劃來解決?如果乙個問題具有以下兩個特徵,那麼就可能適合用動態規劃來解決 如果乙個問題的最優解包含著該問題的子問題的最優解,那麼這個問題就具有最優子結構。擁有最優子結構特徵的問題,就有可能用動態規劃來解決 當然,也有可能用貪婪演算法 在遞迴式中,乙個問題的子問題,以及子子問題的解...