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