本節為手撕**系列之第一彈,主要來手撕排序演算法,主要包括以下幾大排序演算法:
【演算法思想】
每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。
【**實現】
# 直接插入排序
def insert_sort(arr):
length = len(arr)
for i in range(length):
k = i
for j in range(k,0,-1):
if arr[j]【演算法思想】
對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素「浮」到頂端,最終達到完全有序。
【**實現】
# 氣泡排序
def bubblesort(arr):
length = len(arr)
for i in range(length-1):
flag = true
for j in range(length-i-1):
if arr[j]>arr[j+1]:
t = arr[j]
arr[j]=arr[j+1]
arr[j+1]=t
flag = false
if flag:
break
arr = [6,-2,0,9]
bubblesort(arr)
print(arr)
【演算法思想】
每一趟從待排序的資料元素中選擇最小(或最大)的乙個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。
【**實現】
def selectsort(arr):
length = len(arr)
for i in range(length-1):
min = i
for j in range(i+1,length):
if arr[min]>arr[j]:
min=j
if min!=i:
t = arr[i]
arr[i]=arr[min]
arr[min]=t
arr = [6,-2,0,9]
selectsort(arr)
print(arr)
【演算法思想】
快速排序思想----分治法。
每次劃分得到,樞椎的左邊比它小,右邊比它大。
【**實現】
def quicksort(arr,left,right):
# 遞迴終止條件
if left>right:
return
pivot = arr[left]
i = left
j = right
while i=pivot:
j-=1
while i【演算法思想】
該演算法也被稱為:縮小增量排序。
【**實現】
# 希爾排序
def shellsort(arr):
length = len(arr)
# 設定初始增量
gap = length//2
while gap>0:
# 從第gap個元素,逐個對其所在組進行直接插入排序
for i in range(gap,length):
j = i
while j-gap>=0 and arr[j]【演算法思想】
堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。
基本思路:
a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;
b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;(公升序方法)
c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。
堆的定義如下: n個元素的序列當且僅當滿足一下條件時,稱之為堆。
可以將堆看做是乙個完全二叉樹。並且,每個結點的值都大於等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於等於其左右孩子結點的值,稱為小頂堆。
堆排序(heap sort)是利用堆進行排序的方法。其基本思想為:將待排序列構造成乙個大頂堆(或小頂堆),整個序列的最大值(或最小值)就是堆頂的根結點,將根節點的值和堆陣列的末尾元素交換,此時末尾元素就是最大值(或最小值),然後將剩餘的n-1個序列重新構造成乙個堆,這樣就會得到n個元素中的次大值(或次小值),如此反覆執行,最終得到乙個有序序列。
【**實現】
class heapsort:
def heapsort(self, nums):
length = len(nums)
# 從後往前遍歷,交換堆頂與最後葉子節點,並依次調整堆,重複操作
for j in range(length-1,0,-1):
# 獲取堆頂元素(獲取同時,調整堆)
firstnum = self.adjustheap(nums,j+1)
# 交換最後乙個葉子節點與堆頂元素
temp = nums[j]
nums[j] = firstnum
nums[0] = temp
return nums
# 調整堆(最大堆),每次返回最大堆頂元素
def adjustheap(self,nums,length):
# 最後乙個非葉節點
i = length//2 -1
# 從最後乙個非葉節點開始調整,構成最大堆
while i>=0:
temp = nums[i]
k = 2*i+1
while ktemp:
nums[i]=nums[k]
i=kelse:
break
k=2*k+1
nums[i] = temp
i-=1
return nums[0]
s = heapsort()
nums = [8,9,7,10]
t = s.heapsort(nums)
print(t)
【演算法思想】
歸併排序是利用歸併的思想實現的排序方法,該演算法採用經典的分治策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
【**實現】
和:
7種排序演算法的介紹(常用)
一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...
7種排序演算法的介紹(常用)
一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...
列表逆序排序 常用七種排序的Python實現
演算法複雜度分為時間複雜度和空間複雜度。其中,時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此複雜度分為時間和空間複雜度。用大o表示。常見的時間複雜度 按...