比較相鄰的兩元素,不滿足大小關係則互換,一次遍歷能將乙個元素放到正確的位置上。完成排序需要n次遍歷,則事件複雜度o(n^2),可以不使用額外的資料結構,則空間複雜度為o(1),可以相等時不交換,則是穩定的排序演算法。
python3**大致如下:
from typing import list
def bubblesort(nums: list[int])-> none:
n = len(nums)
if n < 2:
return
for i in range(0, n):
for j in range(0, n-i-1):
if nums[j] < nums[j+1]:
nums[j],nums[j+1] = nums[j+1], nums[j]
nums = [2, 3, 5, 7, 1, 9, 3]
bubblesort(nums)
print(nums)
開始將第乙個元素劃分為有序區間,後面為無序區間,逐步將無序區間的元素插入到有些區間中。兩層迴圈,乙個區間劃分遍歷一次資料,第二層插入資料,大致為o(n^2),空間複雜度為o(1),資料相等時不交換,穩定的排線演算法。**大致如下:
from typing import list
def insertionsort(nums: list[int])-> none:
n = len(nums)
if n < 2:
return
for i in range(1, n):
value = nums[i]
# 尋找插入的位置
j = i - 1
while j > -1:
# 資料往後移
if nums[j] < value:
nums[j+1] = nums[j]
else:
break
j = j - 1
# 插入資料
nums[j+1] = value
nums = [2, 3, 5, 7, 1, 9, 3]
insertionsort(nums)
print(nums)
開始劃分1個有序區間,後面查詢最小或最大元素放入區間內。時間複雜度o(n^2),空間o(1),不穩定。**大致如下:
from typing import list
def selectsort(nums: list[int])-> none:
n = len(nums)
if n < 2:
return
for i in range(0, n-1):
for j in range(i+1, n):
if nums[i] < nums[j]:
nums[i], nums[j] = nums[j], nums[i]
nums = [2, 3, 5, 7, 1, 9, 3]
selectsort(nums)
print(nums)
使用分治的思路,把陣列分成兩半,分別排序,排序後進行合併。大致**如下:
from typing import list
def mergesort(nums: list[int])-> list[int]:
n = len(nums)
if n == 1:
return nums
mid = n // 2
lsort = mergesort(nums[:mid])
rsort = mergesort(nums[mid:])
return merge(lsort, rsort)
def merge(nums1: list[int], nums2: list[int])-> list[int]:
nums =
n = len(nums1)
m = len(nums2)
index1 = 0
index2 = 0
while index1 < n or index2 < m:
if index1 >= n:
index2 = index2 + 1
elif index2 >= m:
index1 = index1 + 1
elif nums1[index1] < nums2[index2]:
index1 = index1 + 1
else:
index2 = index2 + 1
return nums
nums = [2, 3, 5, 7, 1, 9, 3]
print(mergesort(nums))
也是使用分治的思路,隨機選取其中乙個數最為分界點,把小於其的數反左邊或右邊,大於其的數類似。大致**如下:
from typing import list
def quicksort(nums: list[int], start: int, end: int)-> none:
if start >= end:
return
mid = partition(nums, start, end)
# 注意後面排序的序號,排序是不包括分界元素的
quicksort(nums, start, mid-1)
quicksort(nums, mid+1, end)
def partition(nums: list[int], start: int, end: int)-> int:
"""選取最後乙個元素為分界,小於的放左,使用了雙指標交換元素
"""value = nums[end]
index = start
for i in range(start, end):
if nums[i] < value:
nums[i], nums[index] = nums[index], nums[i]
index = index + 1
nums[index], nums[end] = nums[end], nums[index]
return index
nums = [2, 3, 5, 7, 1, 9, 3]
quicksort(nums, 0, len(nums)-1)
print(nums)
基礎排序演算法總覽
比較相鄰的兩元素,不滿足大小關係則互換,一次遍歷能將乙個元素放到正確的位置上。完成排序需要n次遍歷,則事件複雜度o n 2 可以不使用額外的資料結構,則空間複雜度為o 1 可以相等時不交換,則是穩定的排序演算法。python3 大致如下 from typing import list defbubb...
八大排序演算法總覽
插入排序 1 直接插入排序 穩定排序,時間複雜度o n 2 2 希爾排序 直接插入排序的優化,非穩定排序,時間複雜度o n 1 3 選擇排序 1 簡單選擇排序 非穩定排序,時間複雜度o n 2 2 堆排序 非穩定排序,時間複雜度o nlogn 用於topk問題 交換排序 1 氣泡排序 穩定排序,時間...
Web基礎題總覽
題目特徵明顯 sql注入 登入框,變化的url引數 f12原始碼分析 注釋提示 隱藏路徑 了解伺服器的資訊隱藏的配置檔案,自己進行推理 登入後台型別 偽造本地位址,爆破,萬能密碼,cookie欺騙 看原始碼可以右鍵 檢視網頁源 也可以用火狐和谷歌瀏覽器的按f12鍵,按f12鍵可以修改html源 方便...