給出一個陣列,[1,5,3,9,4,2],對其排序。
下面介紹兩種排序演算法。
一,選擇排序
選擇排序:找出一個陣列最小的數,然後在原陣列中刪除這個數,並加入到一個新的陣列,持續遍歷。
def selectSmallest(arr): #找出最小的數 samllest = arr[0] smallestIndex = 0 #一定要設一個初始值,不然後面arr只剩兩個數的時候進入不了if語句,會報錯。 for i in range(1,len(arr)): if arr[i] < samllest: samllest = arr[i] smallestIndex = i return smallestIndex #返回索引 def selectionSort(arr): #選擇排序 newarr = [] for i in range(len(arr)): smallindex = selectSmallest(arr) newarr.append(arr.pop(smallindex)) print(arr) return newarr
print(selectionSort([7,4,6,2,9]))
結果如下:
[7, 4, 6, 9] [7, 6, 9] [7, 9] [9] [] [2, 4, 6, 7, 9]
從結果可以看到,選擇排序正如前面所說,先找出最小值,然後刪除。
從程式碼中,我們知道包含了兩個for迴圈,它的迴圈時間為O(n**2),速度很慢。
二,快速排序
快速排序,一看這個名字就知道速度畢竟快,快速排序的程式碼非常精簡,因為它運用了遞迴。
快速排序原理:先在列表中任意找一個數a,大於等於a的數加入一個列表,我們取名為high列表,比a小的數我們加入到一個列表,取名為low,現在我們有三個資料,low,a,high,然後對low和high繼續前面的操作,一直到low,high列表為空或者只有一個數時結束。
程式碼如下
def quickSort(alist): low = [] #定義兩個列表,待會來儲存資料 high = [] if len(alist) > 1: #如果列表為空或者只有一個資料,直接返回列表,遞迴結束條件 for i in alist[1:]: #進入迴圈,大於等於列表第一個數的數加入到high列表,比它小的數加入到low列表 if i >= alist[0]: high.append(i) else: low.append(i) return quickSort(low)+[alist[0]]+quickSort(high) #遞迴,呼叫自身 else: return alist print(quickSort([3,6,5,4,87]))
結果:
[3, 4, 5, 6, 87]