對幾種算法作說明:html
名稱python |
複雜度算法 |
說明數據結構 |
備註dom |
冒泡排序 |
O(N*N)spa |
將待排序的元素看做是豎着排列的「氣泡」,較小的元素比較輕,從而要往上浮.net |
|
插入排序code Insertion sorthtm |
O(N*N) |
逐一取出元素,在已經排序的元素序列中從後向前掃描,放到適當的位置 |
起初,已經排序的元素序列爲空 |
選擇排序 |
O(N*N) |
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小元素,而後放到排序序列末尾。以此遞歸。 |
找最小元素排序 |
快速排序 Quick Sort |
O(n *log2(n)) |
先選擇中間值,而後把比它小的放在左邊,大的放在右邊(具體的實現是從兩邊找,找到一對後交換)。而後對兩邊分別使用這個過程(遞歸)。 |
肯定中間值和索引的排序 |
堆排序HeapSort |
O(n *log2(n)) |
利用堆(heaps)這種數據結構來構造的一種排序算法。堆是一個近似徹底二叉樹結構,並同時知足堆屬性:即子節點的鍵值或索引老是小於(或者大於)它的父節點。 |
近似徹底二叉樹 |
希爾排序 SHELL |
O(n1+£) 0<£<1 |
選擇一個步長(Step) ,而後按間隔爲步長的單元進行排序.遞歸,步長逐漸變小,直至爲1. |
|
箱排序 |
O(n) |
設置若干個箱子,把關鍵字等於 k 的記錄全都裝入到第k 個箱子裏 ( 分配 ) ,而後按序號依次將各非空的箱子首尾鏈接起來 ( 收集 ) 。 |
分配排序的一種:經過" 分配 " 和 " 收集 " 過程來實現排序 |
快速排序的實現:
#!/usr/bin/env python #coding:utf-8 import random import time t_a = time.time() def get_sort_index(lis, a, b):
"""
每調用一次完成一次對中間值的排序,共需調用log2(b-a)次
""" tmp = lis[a] while a < b: while a < b and lis[b] >= tmp: b -= 1 lis[a] = lis[b] while a < b and lis[a] <= tmp: a += 1 lis[b] = lis[a] lis[a] = tmp return a def quick(li, s, e): if s < e: mid = get_sort_index(li, s, e) quick(li, s, mid-1) quick(li, mid+1, e) l = list(range(100)) random.shuffle(l) print(l) quick(l, 0, len(l)-1) print("after quick: %.2f"%(time.time() - t_a)) print(l)
https://www.cnblogs.com/wulaoer/p/5507174.html
https://blog.csdn.net/ZhangQiye1993/article/details/81532103