八大排序演算法python實現

2021-09-19 22:04:20 字數 3494 閱讀 2309

1.氣泡排序

氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端,故名。

步驟:比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

針對所有的元素重複以上的步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

**實現:

# -*- coding:utf-8 -*-

def bubble_sort(list):

length=len(list)

for index in range(length):

for i in range(1,length-index):

if list[i-1]2.選擇排序

從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

# -*- coding:utf-8 -*-

def select_sort(list):

length=len(list)

for index in range(length):

for i in range(index,length):

if list[index]3.插入排序

每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。

步驟:從第乙個元素開始,該元素可以認為已經被排序

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

如果該元素(已排序)大於新元素,將該元素移到下一位置

重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

將新元素插入到該位置後

重複步驟2~5

**實現:

# -*- coding:utf-8 -*-

def insert_sort(lists):

# 插入排序

count = len(lists)

for i in range(1, count):

key = lists[i]

j = i - 1

while j >= 0:

if lists[j] > key:

lists[j + 1] = lists[j]

lists[j] = key

j -= 1

return lists

#測試list=[10,23,1,53,654,54,16,646,65,3155,546,31]

print insert_sort(lists)

4.希爾排序

先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序;然後,取第二個增量d20:

for i in range(dist,length):

temp=list[i]

j=iwhile j>=dist and temp5.歸併排序

歸併排序,就是把兩個已經排列好的序列合併為乙個序列。

**實現:

# -*- coding:utf-8 -*-

#演算法邏輯比較簡單,以第乙個list為基準,第二個向第乙個插空

def merge_sort(list1,list2):

length_list1=len(list1)

length_list2=len(list2)

list3=

j=0for i in range(length_list1):

while list2[j]6.快速排序

隨意選擇乙個數字作為基準,比基準數字大的在右,比基準數字小的在左。

# -*- coding:utf-8 -*-

def kp(arr,i,j):#快排總函式

#制定從哪開始快排

if i=base:

j-=1

while i7.堆排序

堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

步驟:建立最大堆:將堆所有資料重新排序,使其成為最大堆

最大堆調整:作用是保持最大堆的性質,是建立最大堆的核心子程式

堆排序:移除位在第乙個資料的根節點,並做最大堆調整的遞迴運算

**實現:

# -*- coding:utf-8 -*-

def head_sort(list):

length_list = len(list)

first=int(length_list/2-1)

for start in range(first,-1,-1):

max_heapify(list,start,length_list-1)

for end in range(length_list-1,0,-1):

list[end],list[0]=list[0],list[end]

max_heapify(list,0,end-1)

return list

def max_heapify(ary,start,end):

root = start

while true:

child = root*2 + 1

if child > end:

break

if child + 1 <= end and ary[child]8.計數排序

# -*- coding:utf-8 -*-

def count_sort(list):

max=min=0

for i in list:

if i < min:

min = i

if i > max:

max = i

count = [0] * (max - min +1)

for j in range(max-min+1):

count[j]=0

for index in list:

count[index-min]+=1

index=0

for a in range(max-min+1):

for c in range(count[a]):

list[index]=a+min

index+=1

return list

#測試:

list=[10,23,1,53,654,54,16,646,65,3155,546,31]

print count_sort(list)

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...

八大排序演算法

一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...

八大排序演算法

排序的定義 輸入 n個數 a1,a2,a3,an 輸出 n個數的排列 a1 a2 a3 an 使得a1 a2 a3 an in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序...