選擇排序和快速排序

清減幾分發表於2020-08-16

給出一個陣列,[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]

 

相關文章