Python之排序與查找

排序

      排序(Sort)是將無序的記錄序列(或稱文件)調整成有序的序列。排序方法有很多種,下面舉例說明:

    冒泡排序

          冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

# 冒泡排序
def bubbling_sort(data):
    for i in range(len(data) - 1):
        for j in range(i + 1, len(data)):
            # 從頭開始,每取一個元素都和後面的所有元素相比
            if data[i] > data[j]:
                data[i], data[j] = data[j], data[i]

    快速排序

         從數列中挑出一個元素,稱爲 "基準"pivot),重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作。 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。   

示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

def sub_sort(data, low, high):
    # 將第一個值作爲基礎值備份出來
    key = data[low]
    while low < high:
        # 從後面開始將小於基礎值的元素往前移動到最前面
        while low < high and data[high] > key:
            high -= 1
        data[low] = data[high]
        # 從前面開始將大於基礎值的元素往後移動到最後面
        while low < high and data[low] < key:
            low += 1
        data[high] = data[low]
    # 前後索引集中在一起時結束,將基礎值填充進去,並返回所在索引
    data[low] = key
    return low


def quick(data, low, high):
    # low 開頭索引
    # high 末尾索引
    if low < high:
        key = sub_sort(data, low, high)
        # 將利用基礎值分割的左右兩部分迭代進行處理,直到結束
        quick(data, low, key - 1)
        quick(data, key + 1, high)

    插入排序

             對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入,插入排序在實現上,通常在從後面向前掃描過程中,需要反覆把已排序元素逐步向後挪威,爲最新元素提供插入空間

示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

def insert_sort(data):
    for i in range(1, len(data)):
        # 從第二個開始取一個值
        x = data[i]
        # 當前索引
        j = i
        # 往前依次找比當前值大的進行交換,直到沒有
        while j > 0 and data[j - 1] > x:
            data[j] = data[j - 1]
            j -= 1
        # 將取到值插入進去
        data[j] = x

    選擇排序

            工作原理爲,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。以此類推,直到所有元素均排序完畢

 示例:

list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]

def choose_sort(data):
    for i in range(len(data) - 1):
        # 假定本次是最小
        min_index = i
        for j in range(i + 1, len(data)):
            # 發現後面有比本次還小,則標記它爲最小
            if data[j] < data[min_index]:
                min_index = j
        # 如果最小的不是本次最小則交換位置
        if min_index != i:
            data[i], data[min_index] = data[min_index], data[i]

 

查找

    二分法查找

       例如,隨機一個1~100中的數,猜一猜數字是幾,我們會先猜中數50,如果小了就會接着猜75,如果是大了就會接着猜25,以此類推。

    

data = [i for i in range(1, 101)]


# 找出指定數據的下標
def search(data, key):
    low = 0
    high = len(data) - 1
    while low <= high:
        mid = (low + high) // 2
        if data[mid] > key:
            high = mid - 1
        elif data[mid] < key:
            low = mid + 1
        else:
            return mid
    return -1


print(search(data, 80))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章