1氣泡排序,複雜度o(n2
)最慢,效率最低
臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,
這樣一趟過去後,最大或最小的數字被交換到了最後一位,
然後再從頭開始進行兩兩比較交換,直到倒數第二位時結束,以此類推比較第i次。。。
list=[6,3,4,8,1,10]for i in
range(len(list)):
for j in range(1,len(list)-i):
print i,j,list[j-1],list[j]
if list[j-1] >list[j]:
list[j-1],list[j]=list[j],list[j-1]
list
print list
2選擇排序,複雜度o(n2
)
每次遍歷選擇乙個最值,和冒泡的區別在於交換的是位置,也就是腳標
3插入排序複雜度o(n2)
插入排序通過把序列中的值插入乙個已經排序好的序列中,直到該序列的結束。插入排序是對氣泡排序的改進。它比氣泡排序快2倍。一般不用在資料大於1000的場合下使用插入排序,或者重複排序超過200資料項的序列。
4快速排序,複雜度o(nlogn)
對氣泡排序的改進,選出乙個值,其他的數和這個值比較,比這個值小的都放在左邊,比這個值大的都放在右邊
(1) 如果不多於1個資料,直接返回。
(2) 一般選擇序列最左邊的值作為支點資料。
(3) 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。
(4) 對兩邊利用遞迴排序數列(算是很快的排序演算法了,因為遞迴,所以耗記憶體)
defquicksort(l, low, high):
i =low
j =high
if i >=j:
return
l key =l[i]
while i while i < j and l[j] >=key:
j = j-1l[i] =l[j]
while i < j and l[i] <=key:
i = i+1l[j] =l[i]
l[i] =key
quicksort(l, low, i-1)
quicksort(l, j+1, high)
return
ll=[12, 6, 9, 7, 5, 11, 4, 8, 3, 10]
print quicksort(l, 0, 9)
#i=0,j=len(l)-1
5堆排序複雜度o(nlogn)
堆排序適合於資料量非常大的場合(百萬資料)。
堆排序不需要大量的遞迴或者多維的暫存陣列。這對於資料量非常巨大的序列是合適的。比如超過數百萬條記錄,因為快速排序,歸併排序都使用遞迴來設計演算法,在資料量非常大的時候,可能會發生堆疊溢位錯誤。
堆排序會將所有的資料建成乙個堆,最大的資料在堆頂,然後將堆頂資料和序列的最後乙個資料交換。接下來再次重建堆,交換資料,依次下去,就可以排序所有的資料。
常用的演算法
排序演算法 氣泡排序 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。直接插入排序 要排序的一組數中,假設前面 n 1 n 2 個數已經是排 好順序的...
常用的排序演算法
排序方式 插入排序 直接插入排序 shell排序 選擇排序 直接選擇排序 堆排序交換排序 氣泡排序 快速排序 歸併排序 分配和索引排序 基數排序 桶式排序 include using namespace std 直接插入排序 arr為待排陣列,n為陣列長度 void insertsort int a...
常用的查詢演算法
1 mid low high 2 2 當k arr mid 時,low mid 1,並重複1 當k 當k arr mid 時,找到,結束。直到low high,還沒找到那麼說明該關鍵字不存在。核心 實現 演算法步驟 1 第一步確定查詢節點在那個表中的那一塊。2 第二步在確定的塊中找到該節點。1 雜湊...