假設初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到[n/2]個長度為2或者1的有序子串行;再兩兩歸併,…,如此重複,直至得到乙個長度為n的有序序列為止。歸併排序是一種比較占用記憶體,但是卻效率高並穩定的演算法,時間複雜度是o(logn).
對簡單選擇排序的一種改進,堆是乙個完全二叉樹,它是將待排序的序列構造成乙個最大堆或者最小堆。然後,整個序列的堆頂就是根結點。移走堆頂,調整其餘元素,重新構成乙個堆。如此反覆執行,便能得到乙個序列了。堆排序的時間複雜度是o(logn),由於記錄的比較和交換是跳躍式進行的,因此是一種不穩定的排序。
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import random
# 歸併排序,感覺遞迴的實現很耗記憶體,有繼續優化的空間
defmerge
(left, right):
i, j = 0, 0
result =
while i < len(left) and j < len(right):
if left[i] <= right[j]:
i += 1
else:
j += 1
result += left[i:]
result += right[j:]
return result
defmerge_sort
(lists):
# 歸併排序
if len(lists) <= 1:
return lists
num = len(lists) / 2
# 遞迴將lists[:num]歸併為有序的left
left = merge_sort(lists[:num])
# 遞迴將lists[num:]歸併為有序的right
right = merge_sort(lists[num:])
result = merge(left, right)
return result
# 堆排序
defsift_down
(location, list_length):
flag = 0
while location * 2
<= list_length and flag == 0:
# 首先判斷它和左兒子的關係, 並用t記錄值較大的節點編號
if heap_list[location] < heap_list[location*2]:
t = location * 2
else:
t = location
# 如果它有右兒子 ,再對右兒子進行討論
if location*2+1
<= list_length:
# 如果右兒子的值更大, 更新較小的結點編號
if heap_list[t] < heap_list[location*2+1]:
t = location*2+1
# 如果發現最大的結點編號不是自己, 說明子結點中有比父結點更大的
if t != location:
heap_list[t], heap_list[location] = heap_list[location], heap_list[t]
location = t
else:
flag = 1
return
defheap_sort
():# 建立堆函式
list_length = len(heap_list) - 1
for start in range((list_length/2), 0, -1):
sift_down(start, list_length)
# 堆排序
while list_length > 1:
heap_list[1], heap_list[list_length] = heap_list[list_length], heap_list[1]
list_length -= 1
sift_down(1, list_length)
return test_list[1:]
if __name__ == "__main__":
testlist = [random.randint(1, 100) for _ in range(1, 1000000)]
print merge_sort(testlist)
heap_list = [-1] + [random.randint(1, 100) for _ in range(1, 10000000)]
print(heap_sort())
資料結構與演算法小結 排序(三)
2.選擇排序 2.1 簡單選擇排序 簡單選擇排序的主要思想是,對第i個元素,將其與後面的n i個元素作比較,用乙個min變數儲存這n i 1個元素中的最小值的位置,比較完後將a min 和a i 交換 min i 簡單選擇排序進行了 n 2 2次比較,n次交換,交換的次數少。其主要過程如圖所示 簡單...
資料結構與演算法 排序
排序原理 1.比較相鄰的元素。如果前乙個元素比後乙個元素大,就交換這兩個元素的位置。2.對每一對相鄰元素做同樣的工作,從開始第一對元素到結尾的最後一對元素。最終最後位置的元素就是最大 值。氣泡排序的 實現 public static void sortpop int arr 測試 public st...
《資料結構與演算法 排序》
1 快速排序 1.記錄 排序中的結點 2.檔案 一系列結點構成的線性表 3.排序又稱分類 4.排序碼 結點中乙個或者多個字段,其值作為排序運算中的根據。基本思想 每次選擇待排序的記錄序列的第1個記錄,按照排序碼的大小將其插入到已排序的記錄序列的適當位置,直到所有記錄全部排序完畢。最簡單的排序方法。整...