Python實現常見的排序演算法

來源:互聯網
上載者:User

標籤:pen   gap   複雜度   根據   sel   nbsp   insert   python實現   temp   

1.冒泡排序

# [6,3,9,4,2]def bubble_sort(li):    n = len(li)    # 確定冒泡排序的趟數 n - 1    for j in range(n - 1): # 0 1 2 3        count = 0        # 冒泡排序一趟,把最大的一個數排到最右邊        for i in range(n - 1 - j): # 0 3 每一趟冒泡 比較的次數越來越少            if li[i] > li[i + 1]:                # 交換                li[i], li[i + 1] = li[i + 1], li[i]                count += 1        # for迴圈結束時,如果沒有交換過,證明已經有序,直接返回        if count == 0:            breakif __name__ == ‘__main__‘:    l = [1,1,2,4,5,6]    # 3, 6, 4, 2, 9    # i = 3    # 3,6,4,2,9    # 3,4,2,6,9    bubble_sort(l)    print(l)    # 最壞時間複雜度:O(n^2)    # 最優時間複雜度:O(n)    # 穩定性:穩定

2.選擇排序

# [6,3,9,4,2]def select_sort(li):    n = len(li)    # 總共選擇的次數,每次選擇的最小數 放的位置 0 ~ n-1    for j in range(n - 1):        # 選擇一次,找出最小的一個數,放到0位置        temp = j  # 從這個位置開始比較,比較出最小的數放到這個位置        for i in range(j + 1, n):            if li[i] < li[temp]:                temp = i        # for迴圈結束時,temp指向最小的數        # 交換temp和0位置        li[temp], li[j] = li[j], li[temp]if __name__ == ‘__main__‘:    l = [1,2,3,4,5]    # 2,3,9,4,6    select_sort(l)    print(l)    # 最壞時間複雜度:O(n^2)    # 最優時間複雜度:O(n^2)    # 穩定性:不穩定

3.插入排序

# [6,3,9,4,2]def insert_sort(li):    n = len(li)    # 不停的指向插入排序,從1~n-1 位置的資料,依次跟前面有序的序列組成有序    for j in range(1, n):        # 把0位置的數認為有序,把下一個位置跟前面組成有序        for i in range(j, 0, -1):            if li[i] < li[i - 1]:                li[i], li[i - 1] = li[i - 1], li[i]            else:                breakif __name__ == ‘__main__‘:    l = [1,2,3,4,5]    insert_sort(l)    print(l)    # 最壞時間複雜度:O(n^2)    # 最壞時間複雜度:O(n)    # 穩定性:穩定

4.希爾排序

# [6,1,4,2,5,3]def shell_sort(li):    n = len(li)    # 設定步長,根據步長進行排序    gap = n//2    # 不停的改變步長,最後一個步長必須是1    while gap >= 1:        for i in range(gap, n):            while (i - gap) >= 0:                if li[i] < li[i - gap]:                    li[i], li[i - gap] = li[i - gap], li[i]                i -= gap        gap //= 2if __name__ == ‘__main__‘:    l = [6,1,4,2,5,3]    shell_sort(l)    # 最壞時間複雜度:O(n^2)    # 最壞時間複雜度: 跟步長相關    # 穩定性:不穩定

5.快排

# [6,9,4,8,5,7]def quick_sort(li, start, end):    if start>=end:        return    # 左邊角標    left = start    # 右邊角標    right = end    # 把0位置的數作為中間值    mid = li[left]    while left < right:        # 右邊的角標往左移動,找的一個小於中間值的數,把數放到左邊角標位置        while left < right and li[right] >= mid:            right -= 1        # 當white迴圈結束時,right指向的值小於mid        li[left] = li[right]        # 左邊的角標往右移動,找的一個大於中間值的數,把數放到右邊邊角標位置        while left < right and li[left] <= mid:            left += 1        li[right] = li[left]    # while結束,left=right,把中間值賦值到這個位置    li[left] = mid    # 排序左邊的資料    quick_sort(li, start, left-1)    # 排序右邊的資料    quick_sort(li, left+1, end)if __name__ == ‘__main__‘:    l = [6,8,4,4]    quick_sort(l,0,len(l)-1)    print(l)    # 最壞時間複雜度 : O(n^2)    # 最優時間複雜度 : O(nlogn)    # 穩定性:不穩定

6.歸併排序

# [7,6,8,  9,10,2,1]def merge_sort(li):    if len(li) == 1:        # print(li)        return li        # 擷取中間位置    mid = len(li) // 2    # 拆分左右各一半    left = li[:mid]    right = li[mid:]    # print(left)    # print(right)    # 遞迴拆分    left_res = merge_sort(left)    right_res = merge_sort(right)    # result = left_res + right_res    # print(result)    # 合并排序    result = merge(left_res,right_res)    return resultdef merge(left, right):    # 把下層方法返回的資料進行排序    # [6] [8]    # [5,7,9] [6,8]    # 5 6 7    res = []    left_index = 0    right_index = 0    while left_index < len(left) and right_index < len(right):        if left[left_index] <= right[right_index]:            res.append(left[left_index])            left_index += 1        else:            res.append(right[right_index])            right_index += 1    # while結束後,把剩下的資料全部添加    res += right[right_index:]    res += left[left_index:]    return resif __name__ == ‘__main__‘:    l = [7, 8, 6, 9, 10, 2, 1]    print(merge_sort(l))    # 最壞時間複雜度:O(nlogn)    # 最優時間複雜度:O(nlogn)    # 穩定性:穩定

 

Python實現常見的排序演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.