7種常用排序演算法(python實現)

2021-09-12 12:43:23 字數 4126 閱讀 8804

本節為手撕**系列之第一彈,主要來手撕排序演算法,主要包括以下幾大排序演算法:

演算法思想

每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。

**實現

# 直接插入排序

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表示。常見的時間複雜度 按...