假如,有乙個無須序列a=,選擇排序的過程應該如下:
第一趟:選擇最小的元素,然後將其放置在陣列的第乙個位置a[0],將a[0]=6和a[2]=1進行交換,此時a=;
第二趟:由於a[0]位置上已經是最小的元素了,所以這次從a[1]開始,在剩下的序列裡再選擇乙個最小的元素將其與a[1]進行交換。即這趟選擇過程找到了最小元素a[4]=2,然後與a[1]=3進行交換,此時a=;
第三趟:由於a[0]、a[1]已經有序,所以在a[2]~a[8]裡再選擇乙個最小元素與a[2]進行交換,然後將這個過程一直迴圈下去直到a裡所有的元素都排好序為止。這就是選擇排序的精髓。因此,我們很容易寫出選擇排序的核心**部分,即選擇的過程,就是不斷的比較、交換的過程。
整個選擇的過程如下圖所示:
選擇排序
'''def selection_sort(a):
for i in range(len(a) - 1):
min = i
for j in range(i + 1, len(a)):
if a[min] > a[j]:
min = j
if min != i:
a[min], a[i] = a[i], a[min]
return a
介紹:
氣泡排序(bubble sort,台灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
步驟:比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟,除了最後乙個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
氣泡排序
'''def dubble_sort(a):
for i in range(len(a)):
for j in range(i+1,len(a)):
if a[i] > a[j]:
a[i],a[j] = a[j],a[i]
return a
有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為o(n^2)。是穩定的排序方法。插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後乙個元素除外(讓陣列多乙個空間才有插入的位置),而第二部分就只包含這乙個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。
介紹:
快速排序(quicksort)是對氣泡排序的一種改進。在平均狀況下,排序 n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的資料,可以決定設計的選擇,減少所需時間的二次方項之可能性。
步驟:從數列中挑出乙個元素,稱為 「基準」(pivot),
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
'''
快速排序
'''def sub_sort(array,low,high):
key = array[low]
while low < high:
while low < high and array[high] >= key:
high -= 1
while low < high and array[high] < key:
array[low] = array[high]
low += 1
array[high] = array[low]
array[low] = key
return low
def quick_sort(array,low,high):
if low < high:
key_index = sub_sort(array,low,high)
quick_sort(array,low,key_index)
quick_sort(array,key_index+1,high)
'''''
隨機生成0~10000000之間的數值
'''def getrandata(num):
a=i=0
while i
i+=1
return a
'''隨機生成20個長度為10000的陣列
'''a =
for i in range(20):
'''測試時間函式
'''def time_it(f,a):
t =
for i in range(len(a)):
t1 = time.time()
f(a[i])
t2 = time.time()
return t
tt1 = time_it(selection_sort,copy.deepcopy(a))
tt2 = time_it(dubble_sort,copy.deepcopy(a))
tt3 = time_it(insertion_sort,copy.deepcopy(a))
tt4 = time_it(quick_sort,copy.deepcopy(a))
print np.mean(tt1),tt1
print np.mean(tt2),tt2
print np.mean(tt3),tt3
print np.mean(tt4),tt4
經典排序演算法的總結及Python實現
排序的穩定性和複雜度 不穩定 選擇排序 selection sort o n2 快速排序 quicksort o nlogn 平均時間,o n2 最壞情況 對於大的 亂序串列一般認為是最快的已知排序 希爾排序 shell sort o nlogn 穩定 插入排序 insertion sort o n...
經典排序演算法(Python實現)
氣泡排序 演算法思想 公升序排序 第一次遍歷,依次比較相鄰兩個元素的大小,大的放後面小的放前面,找到最大的元素排在最後,以此類推遍歷n 1次。def bubblesort array length len array for i in range length for j in range leng...
經典排序演算法 選擇排序 python實現
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理 首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。演算法描述 n個記錄的直接選擇排序可經過n ...