資料結構與演算法 排序 三

2021-07-29 12:54:18 字數 2376 閱讀 9994

假設初始序列含有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個記錄,按照排序碼的大小將其插入到已排序的記錄序列的適當位置,直到所有記錄全部排序完畢。最簡單的排序方法。整...