幾種常用的排序演算法(二) python實現

2021-08-05 22:09:02 字數 1608 閱讀 3050

5. 折半插入排序,時間複雜度o(n*logn),演算法穩定。

思路:假設將新元素,插入已經排好序的陣列當中,尋找插入位置的時候,採用了二分查詢,折半插入排序也叫二分插入排序。

為陣列排序時,也是將第乙個元素作為已經排好序的陣列,迴圈陣列 若元素 arr[i] 小於 arr[i-1] 則為要插入的元素。

利用二分查詢尋找插入位置,然後將插入位置後面的所有元素都後移一位,之後將該元素插入。

特別要注意的是:二分查詢最後的結果要利用得是 左邊界--low,總體來說是將 low 以及 low 以後的所有元素後移一位。將該元素

插入在 low 位置 。

# 折半插入排序

def binary_insertsort(arr):

if len(arr) < 2:

return arr

for i in range(1,len(arr)):

if arr[i] < arr[i-1]:

temp = arr[i]

low = 0

high = i-1

while low <= high:

mid = (low + high)//2

if temp < arr[mid]:

high = mid - 1

else:

low = mid + 1

j = i - 1

while j >= low:

arr[j+1] = arr[j]

j = j - 1

arr[low] = temp

return arr

#測試arr = [1, 4, 7, 2, 5, 8, 3, 6, 9]

print(binary_insertsort(arr))

6. 希爾排序,時間複雜度o(n),演算法不穩定。

思路:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,

然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一

次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率很高。

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

def shell_sort(arr):

if len(arr) < 2:

return arr

gap = len(arr)

while gap > 1:

gap = gap // 3 + 1

for i in range(gap, len(arr)):

if arr[i] < arr[i-gap]:

temp = arr[i]

j = i - gap

while j >= 0 and temp < arr[j]:

arr[j+gap] = arr[j]

j = j - gap

arr[j+gap] = temp

# print(arr)

return arr

#測試arr = [1, 4, 7, 2, 5, 8, 3, 6, 9]

print(shell_sort(arr))

幾種常用的排序演算法

介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實...

幾種常用的排序演算法

介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實...

幾種常用的排序演算法

size large 按照排序過程中所使用的內外存情況不同,可把排序分為內排序和外排序兩大類 若排序過程全部在記憶體資料表 如陣列 中進行,則成為內排序,若排序過程需要不斷地進行記憶體陣列和外村檔案之間的資料交換,則成為外排序。對於大的資料檔案,由於記憶體限制不能一次裝入記憶體進行排序,只能進行外排...