python 幾個簡單算法詳解


一、冒泡排序

基本思想:它的思路很有特點循環,兩兩向后比較。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。

#冒泡排序
# def bubble_sort(li):
#     for i in range(len(li)-1):   #走一趟,循環的次數
#         for j in range(len(li)-i-1):  #有序列為,len(li)-i,去掉有序不循環
#             if li[j]>li[j+1]:   #如果后一個數大,那就交換
#                 li[j],li[j+1]=li[j+1],li[j]

 

二、選擇排序

基本思想:從所有序列中先找到最小的,然后放到第一個位置。之后再看剩余元素中最小的,放到第二個位置……以此類推,就可以完成整個的排序工作了。

選擇排序
def select_sort(li):
    for i in range(len(li)-1):    #循環趟
        min_loc=i                 #設置i為最小下標
        for j in range(1+i,len(li)-1):    #循環無序區
            if li[min_loc]>li[j]:   #如過不是最小值,就換下標
                min_loc=j
        if min_loc!=i:                #如果下標不是原來的值,就互換
            li[i],li[min_loc]=li[min_loc],li[i]

 

三、插入排序

基本思想:將列表分為有序區和無序區兩個部分,最初有序區只有一個元素,.每次從無序區選擇一個元素,插入到無序區的位置,直到無序區變空.

# 插入排序
def insert_sort(li):
    for i in range(1, len(li)):   #走趟,從第一個數開始
        tmp = li[i]              #tmp為無序區手中拿的那張牌
        j = i - 1                #j 為有序區的右側第一張牌
        while j >= 0 and tmp < li[j]:
            print(li)
            #當 有序區至少一張牌,且有序區右側第一張牌大於需要插入的牌時
            li[j + 1] = li[j] #有序區右側第一張牌繼續向右移位,
            j = j - 1          #有序區向右移一位,繼續讓手牌去比較
        li[j + 1] = tmp    #當手牌不比左邊的牌大了,將手牌插入

 

四、快速排序

基本思想:取一個元素p(第一個元素),使p歸位,,,列表被分為兩部分,左邊都比p小,右邊都比p大,.遞歸完成排序

# 取一個元素p(第一個元素),使元素p歸位;
# 列表被p分成兩部分,左邊都比p小,右邊都比p大;

第一種實現方式:
# def partition(data, left, right): #傳入,左右下標 # tmp = data[left] #取第一個元素 # while left < right: #如果左<右 # while left < right and data[right] >= tmp: #左<右 的同時 右邊的值>=第一個元素 # right -= 1 #右邊向左移 # data[left] = data[right] #不大於的時候,左邊的值換到右邊來 # while left < right and data[left] <= tmp: #左<右 的同時 左邊的值<=第一個元素 # left += 1 #左邊向左移動 # data[right] = data[left] #不大於的時候,右邊的值換到左邊來 # data[left] = tmp #這時候左右下標應該指向一個,就確定了tmp的位置 # return left # # 遞歸完成排序。 # def quick_sort(data, left, right): # if left < right: # mid = partition(data, left, right) # quick_sort(data, left, mid - 1) # quick_sort(data, mid + 1, right) # arr = [1, 4, 7, 1, 5, 5, 3, 85, 34, 75, 23, 75, 2, 0] # quick_sort(arr,0,len(arr)-1) # print(arr)
# 第二種方式

def
quickSort(array): if len(array) < 2: #如果數組就一個值,那就直接返回 return array else: pivot = array[0] #拿到第一個值, less = [i for i in array[1:] if i < pivot] #比這個值小的都放左邊, greater = [j for j in array[1:] if j > pivot] #比這個值大的都扔右邊 return quickSort(less) + [pivot] + quickSort(greater) #返回這個數組 print(quickSort([1,5,2,6,9,3]))

 

五、歸並排序

基本思想:假設我們有一個沒有排好序的序列(14,12,15,13,11,16),那么首先我們使用分割的辦法將這個序列分割成一個個已經排好序的子序列。然后再利用歸並的方法將一個個的子序列合並成排序好的序列。分割和歸並的過程可以看下面的圖例。這樣通過先遞歸的分解數列,再合並數列就完成了歸並排序。

def merge(left,right):
    result = []
    while left and right:  #當兩邊都有值的時候
        result.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
    while left:  #只有Left有值的時候
        result.append(left.pop(0))
    while right:   #只有right有值的時候
        result.append(right.pop(0))

    return result

def mergeSort(relist):
    if len(relist) <= 1:
        return relist
    mid_index = len(relist)//2   #先將列表查分為兩部分
    left = mergeSort(relist[:mid_index])  # 遞歸拆解的過程
    right = mergeSort(relist[mid_index:])
    return merge(left,right)  # 合並的過程

print(mergeSort([1,5,2,9]))

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM